2009-12-21 6 views
5

Ich habe ein benutzerdefiniertes Steuerelement mit einer DependencyProperty MyAnimal - Ich binde eine Animal-Eigenschaft in meinem ViewModel an die MyAnimal DependencyProperty.wpf Wie erkennt man, wenn die Datenbindung beendet ist?

Ich habe eine TextBox auf dem Steuerelement hängen, damit ich ein Ereignis auslösen kann - wann immer ich das Ereignis auslösen wird die MyAnimal -Eigenschaft festgelegt - jedoch wenn ich einen Unterbrechungspunkt auf den Setter der MyAnimal -Eigenschaft gesetzt wird nie gefeuert !

Ich denke, ich vermisse etwas Grundlegendes über WPF Abhängigkeit Eigenschaften/Bindung ?!

Und so meine Frage ist, wenn ich den Setter nicht verwenden kann, wie kann ich herausfinden, wann es eingestellt wurde? Wenn ich setze, wenn ich nach InitializeComponent() einen Nullpunkt setzen würde und ich gucke, ob es ein Event gibt, an dem sich ein - DatabindingFinished oder ähnliches anschließen kann? aber kann nicht sehen, was es wäre ...

Kann mir bitte jemand helfen?

Danke,

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

Eine Frage - warum verwenden Sie Registerattached und nicht registrieren? Es scheint nicht, dass dies eine angehängte Eigenschaft sein sollte, sondern eher eine normale DP ... –

+0

das ist ein sehr guter Punkt, Prost - kopieren und einfügen! –

Antwort

5

Die Setter-Methoden werden nie von der Laufzeit aufgerufen. Sie gehen direkt zur DependencyProperty. Sie müssen Ihrem Aufruf von RegisterAttached() ein zusätzliches Argument hinzufügen. Dort können Sie ein PropertyChangedCallback hinzufügen. Hier

ist ein Beispielcode:

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

Der Setter nur für die Nutzung gibt es - man kann tatsächlich die Eigenschaft aus ganz verlassen, da Databinding die tatsächliche DependencyProperty selbst verwendet, nicht die CLR-Eigenschaft.

Wenn Sie sehen müssen, wann sich die Eigenschaft ändert, müssen Sie PropertyMetadata für Ihre Abhängigkeitseigenschaft angeben und eine PropertyChangedCallback angeben.

Für Details empfehle ich lesen Dependency Property Metadata.