2010-07-23 4 views
1

J'ai créé un contrôle personnalisé avec, entre autres, les éléments suivants:Comment se lier à une propriété personnalisée dans un contrôle personnalisé Silverlight

public partial class MyButton : UserControl 
{ 
    public bool Enabled 
    { 
    get { return (bool)GetValue(EnabledProperty); } 
    set { 
     SetValue(EnabledProperty, value); 
     SomeOtherStuff(); 
     } 
    } 
    } 

    public static readonly DependencyProperty EnabledProperty = 
    DependencyProperty.Register("Enabled", typeof(bool), typeof(MyButton), new PropertyMetadata(true)); 

    public static void SetEnabled(DependencyObject obj, bool value) 
    { 
    obj.SetValue(EnabledProperty, value); 
    } 
    public static bool GetEnabled(DependencyObject obj) 
    { 
    return (bool) obj.GetValue(EnabledProperty); 
    } 
} 

Dans mon XAML, je (essayer de) utiliser la liaison à définir la propriété Activé:

<MyButton x:Name="myButtom1" Enabled="{Binding CanEnableButton}"/> 

Je sais que la liaison entre mon contrôle et le modèle de données sous-jacentes est valide et le travail que je peux lier « IsEnabled » (une propriété native du UserControl sous-jacente) et cela fonctionne comme prévu. Cependant, ma propriété Enabled n'est jamais définie via la liaison ci-dessus. J'ai mis des points d'arrêt sur mon ensemble de propriété/get et ils ne sont jamais frappés du tout.

Je ne peux qu'imaginer J'ai manqué quelque chose concernant la liaison dans mon contrôle personnalisé. Quelqu'un peut-il voir quoi?

J'ai essayé d'implémenter INotifyPropertyChanged sur mon contrôle (et d'appeler l'événement PropertyChanged de mon setter Enabled) ... mais cela ne l'a pas corrigé. [BTW: Dans le cas où vous vous demandez "Pourquoi?": Je ne peux pas intercepter les changements à l'état IsEnabled du contrôle de base, donc j'ai décidé d'implémenter et d'utiliser ma propre version d'une propriété Activer/Désactiver (qui J'ai appelé Enabled) - un où je pourrais brancher mon propre code dans le setter de la propriété]

Répondre

3

Tout d'abord, laissez tomber les paires SetEnabled et GetEnabled, cela n'a de sens que pour une propriété jointe qui n'est pas ce que vous faites. Maintenant, votre problème principal est que vous êtes sous l'hypothèse fausse que les membres get/set de votre propriété sont appelés pendant la liaison, ce n'est pas le cas.

Qu'est-ce que vous avez besoin est de passer un appel de retour méthode dans la propriété des métadonnées, il est ici que vous intercepter des changements et de prendre d'autres actions comme ceci: -

public bool IsEnabled 
    { 
     get { return (bool)GetValue(IsEnabledProperty); } 
     set { SetValue(IsEnabledProperty, value); } 
    } 

    public static readonly DependencyProperty IsEnabledProperty = 
     DependencyProperty.Register(
      "IsEnabled", 
      typeof(bool), 
      typeof(MyButton), 
      new PropertyMetadata(true, OnIsEnabledPropertyChanged)); 

    private static void OnIsEnabledPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     MyButton source = d as MyButton; 
     source.SomeOtherStuff(); 

    } 

    private void SomeOtherStuff() 
    { 
     // Your other stuff here 
    } 

Avec cela en place quelle que soit la façon dont le propery est modifié la procédure SomeOtherStuff va s'exécuter.

+0

Je pense que l'utilisation de l'événement IsEnabledChanged intégré est un meilleur choix que l'implémentation d'une autre propriété "enabled" sur un contrôle. (Voir ma réponse). – WiredPrairie

+0

Merci. C'est utile à savoir. Comme indiqué ci-dessous, l'utilisation de l'événement modifié Activé existant est ce que je devrais (et ferai). Cependant, je l'imagerie, je vais devoir créer une propriété bindable sur un contrôle à un moment donné et vous conseiller sera inestimable à ce moment-là. – Trevor

2

Je suggère d'utiliser l'événement IsEnabledChanged qui fait partie de chaque Control/UserControl.

Cela vous permettrait de vous connecter à l'événement et de faire les actions que vous voulez prendre.

public MainPage() 
{ 
    InitializeComponent(); 

    this.IsEnabledChanged += new DependencyPropertyChangedEventHandler(MainPage_IsEnabledChanged); 
} 

void MainPage_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    // Do SomeStuff 
} 
+0

C'est en effet la meilleure solution, et celle que j'adopterai - merci. J'ai cependant marqué la réponse d'Anthony comme la 'réponse' car elle fournit les informations pertinentes nécessaires pour implémenter une propriété pouvant être liée. – Trevor

Questions connexes