C#, WPF, MVVM und INotifyPropertyChanged

Bin ich immer verwirrt; ich dachte, ich Verstand INotifyPropertyChanged.

Ich habe hier eine kleine WPF-Anwendung mit einem frontend-MainWindow-Klasse, ein viewmodel in der Mitte und ein Modell an der Rückseite.

Das Modell in meinem Fall ist die Simulator-Klasse.

Den SimulatorViewModel ist fast durchsichtig und nur Schnittstellen Eigenschaften zwischen Hauptfenster und Simulator.

Simulator implementiert INotifyPropertyChanged und jede Eigenschaft setter-Simulator ruft die RaisePropertyChanged-Methode:

private string serialNumber;
public string SerialNumber
{
    get { return serialNumber; }
    set
    {
        serialNumber = value;
        RaisePropertyChanged("SerialNumber");
    }
}

public event PropertyChangedEventHandler PropertyChanged;

public void RaisePropertyChanged(string propName)  
{  
    if (this.PropertyChanged != null)  
    {  
        this.PropertyChanged(this, new PropertyChangedEventArgs(propName));  
    }  
}    

In der xaml, ich habe eine TextBox mit Bindung wie diese:

Text="{Binding Path=SerialNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

und der DataContext ist die SimulatorViewModel (aber siehe mein Kommentar über die änderung der DataContext auf das Modell)

ViewModel nur geht, die Eigenschaften durch:

public string SerialNumber  
{  
    get { return Simulator.SerialNumber; }  
    set { Simulator.SerialNumber = value; }  
}  

Programmgesteuerte updates der SerialNumber-Eigenschaft im Simulator nicht propagieren, bis auf die UI, obwohl merkwürdigerweise der erste Wert, eingestellt im Simulator Konstruktor, ist es immer.

Wenn ich Pause auf der SerialNumber-setter in den Simulator und Folgen in RaisePropertyChanged, finde ich, dass PropertyChanged null ist und so die Veranstaltung ist nicht Vermehrung nach oben, um die GUI.

Das führt mich zu mehreren Fragen:

  1. Was genau sollte Einhängen in das PropertyChanged-Ereignis? Ich bin auf der Suche um genauer zu sein als nur "WPF". Was ist der link zwischen diesem Ereignis und der Bindenden Anweisung in xaml?

  2. Warum ist die erste Eigenschaft Wert an die Benutzeroberfläche beim Start, aber nicht nachträglich?

  3. Bin ich Recht zu haben-Simulator (das Modell) die Implementierung von INotifyPropertyChanged, oder sollte es das ViewModel machen? Wenn das ViewModel es tut, dann programmatischen änderungen im Modell nicht auslösen, PropertyChanged, also ich bin unklar, auf das richtige Muster. Ich begreife, dass mein ViewModel ist fast überflüssig, aber das ist aufgrund der Einfachheit des Projektes; eine komplexere würde das ViewModel-Konzept härter arbeiten. Mein Verständnis ist, dass das ViewModel ist der Ort, an interface meine unit-tests.

  • Könnten Sie enthalten den code, der macht die updates für die SerialNumber-Eigenschaft?
  • SerialNumber = GenerateSerialNumber(); - ich glaube nicht, dass das das problem. Aber ich habe gerade entdeckt, dass wenn ich den DataContext zu Simulator (das Modell), es funktioniert alles. Aber heißt das nicht, dass ein ViewModel ist irrelevant?
  • was macht Ihr SimulatorViewModel Aussehen? Von was ich sehen kann, Ihre Simulator-Klasse hat die Rolle, die das ViewModel. Also derzeit Ihre SimulatorViewModel redundant ist. Wie sind Sie propagieren Simulator Benachrichtigungen an die SimulatorViewModel?
  • Ich habe ein Beispiel SimulatorViewModel-Eigenschaft in den code oben für Klarheit. Ja, das viewmodel scheint irrelevant in einem einfachen Fall wie diesem, wie ich sagte, aber in einem komplexeren Fall ist es nützlich wäre. Ich denke, Sie sind Recht Vermehrung Simulator Benachrichtigungen an die SimulatorViewModel. Ist es der Fall, dass der DataContext initiiert Verkabelung der PropertyChanged-Ereignis? Das würde eine Menge erklären. Aber all das scheint einfach zu sein, führt zu der Frage, "welchen Sinn hat eine ViewModel eigentlich dienen?"
InformationsquelleAutor Alan | 2011-02-11
Schreibe einen Kommentar