2016-03-22 15 views
0

Sie wissen, wie eine TextBox seinen Inhalt geändert hat, wenn sich der DataContext ändert (nicht ersetzt, nur geändert)? Nun möchte ich genau wie die Benutzeroberfläche benachrichtigt werden, mit einer Art von Ereignis auf dem DataContext. Bis jetzt habe ich noch keine Möglichkeit gefunden, dies zu tun, und ich gebe gerade auf und abonniere einfach alle Ereignisse auf jedem INotifyPropertyChanged in meinem DataContext. Ich weiß, dass es die DataContextChanged/DataContextChanging Klasse in der Window Klasse gibt, aber bis jetzt kann ich es entweder nicht zum Funktionieren bringen, oder es wird nur ausgelöst, wenn der DataContext vollständig ersetzt wird. Gibt es eine Möglichkeit, dies zu tun?Wpf-Ereignis, wenn DataContext geändert wird

+2

INotifyPropertyChanged genau ist, wie die TextBox es zu – Domysee

+0

Dank @Domysee tut, was das ist, ich nach der Frage zu stellen realisiert. Das Fenster bindet sich nicht an den gesamten Kontext, sondern an die gebundenen Werte, die INotifyPropertyChanged sind. Na sicher! Danke vielmals! –

Antwort

0

Denken Sie darüber nach, was gefragt wird. Wenn sich eine Eigenschaft in einem Datenkontext ändert, wird ein general Ereignis ausgelöst.

Welcher Prozess ist verfügbar, der diesen Vorgang ausführen kann extern?

dezentrale Lösung

Eigenschaften bieten keine Benachrichtigung ändern, wenn sie manuell selbst sind so programmiert, dies zu tun; Daher ist INotifyPropertyChange die Route, die normalerweise verwendet wird.

zentrale Lösung

Andernfalls wird ein separater Manager wird aus der Instanz reflektieren muß einen Snapshot aller Eigenschaften nehmen. Dann wird der Manager bei einem Timer die Instanz nach einem aktuellen Snapshot abfragen und diesen mit dem alten Snapshot vergleichen. Wenn eine Änderung erkannt wird, kann ein Ereignis ausgelöst werden und der neue Snapshot ersetzt den alten.


0

DataContextChanged Ereignis nur ausgelöst, wenn die Datacontext des Fensters vollständig geändert hat (auf null oder eine neue Instanz, etc.). Ich glaube, Sie sind auf dem richtigen Weg, und in Ihrem ViewModel müssen Sie NotifyPropertyChanged abonnieren. In den Event-Handler können Sie auf der entsprechende Eigenschaft wechseln wie folgt:

private void OnNotifyPropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    switch (e.Property) 
    { 
     case "Property1": 
      break; 
     case "Property2": 
      break; 
     case "Property3": 
      break; 
    } 
} 
Verwandte Themen