2009-12-21 4 views
5

J'ai un contrôle personnalisé qui a un DependencyProperty MyAnimal - Je lie une propriété animale sur mon ViewModel à MyAnimal DependencyProperty.wpf comment savoir quand la liaison de données est terminée?

Je suis coincé une zone de texte sur le contrôle afin que je puisse déclencher un événement - à chaque fois que je déclenche l'événement la propriété MyAnimal a été mis - si je mets un point d'arrêt sur le poseur de la propriété MyAnimal il ne fait jamais tiré !

Je suppose qu'il me manque quelque chose de fondamental au sujet des propriétés de dépendance WPF/Binding ?!

Et donc ma question est, si je ne peux pas utiliser le Setter comment puis-je savoir quand il a été réglé? Si je mets si je mets un point de rupture après InitializeComponent() son null et j'ai jeté un coup d'oeil pour voir si theres un événement un peut raccorder à - DatabindingFinished ou semblable? mais ne peut pas voir ce que ce serait ...

Quelqu'un peut-il vous aider s'il vous plaît?

Merci,

Andy

public partial class ControlStrip 
{ 
    public ControlStrip() 
    { 
     InitializeComponent(); 
    } 

    public Animal MyAnimal 
    { 
     get 
     { 
      return (Animal)GetValue(MyAnimalProperty); 
     } 
     set 
     { 
      SetValue(MyAnimalProperty, value); 
     } 
    } 

    public static readonly DependencyProperty MyAnimalProperty = 
     DependencyProperty.RegisterAttached("MyAnimal", typeof (Animal), typeof (ControlStrip)); 

    private void TextBox_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e) 
    { 
     var myAnimal = MyAnimal; 
     MessageBox.Show(myAnimal.Name); 
    } 

} 
+1

Une question - pourquoi utilisez-vous RegisterAttached et non inscrire? Il ne semble pas que cela devrait être une propriété jointe, mais plutôt un DP normal ... –

+0

c'est un très bon point, bravo - copier et coller! –

Répondre

5

Les méthodes setter ne sont jamais appelées par le moteur d'exécution. Ils vont directement à la DependencyProperty. Vous devrez ajouter un argument supplémentaire à votre appel à RegisterAttached(). Là, vous pouvez ajouter un PropertyChangedCallback.

Voici quelques exemples de code:

public static readonly DependencyProperty MyAnimalProperty = 
    DependencyProperty.RegisterAttached("MyAnimal", typeof (Animal), typeof (ControlStrip), new PropertyMetadata(AnimalChanged)); 

private static void AnimalChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
{ 
    // Do work here 
} 
4

Le compositeur est là que pour votre utilisation - vous pouvez réellement quitter la propriété de tout à fait, puisque DataBinding utilise le DependencyProperty réel lui-même, pas la propriété CLR.

Si vous avez besoin de voir quand la propriété change, vous devrez spécifier PropertyMetadata sur votre propriété de dépendance et fournir un PropertyChangedCallback.

Pour plus de détails, je recommande de lire Dependency Property Metadata.

Questions connexes