In dem von Ihnen genannten Kundenbeispiel enthält das CustomerModel alle Informationen, die in Ihrer Datenbank (oder einem anderen Backend) gespeichert sind. Das CustomerViewModel enthält ähnliche Informationen, wenn es auf der Benutzeroberfläche angezeigt werden soll (Name usw., potenziell 50 weitere Eigenschaften, wenn Sie eine große Klasse haben), verwendet jedoch die Schnittstelle INotifyPropertyChanged, um sie als Eigenschaften anzuzeigen, an die die Ansicht (d. h. die XAML) binden kann.
z.B..
public int Name
{
get
{
return this.name;
}
set
{
if (this.name!= value)
{
this.name= value;
this.OnPropertyChanged("Name");
}
}
}
Das ViewModel enthält auch andere Teile des UI-Status - Sichtbarkeitsflags, den aktuellen Tab-Index, komplexere Textteile, die aus Daten in mehreren Feldern bestehen, ObservableCollection<> von Kindelementen usw. Alle sind dazu da, an die XAML gebunden zu werden.
Ich habe gesehen, dass das ViewModel aus dem Model als einmaliger, einseitiger Prozess erstellt wird, z.B. mit einem Konstruktor:
CustomerViewModel viewModel = new CustomerViewModel(customer);
oder als Erweiterungsmethode
CustomerViewModel viewModel = customer.ToViewModel();
Ich habe keine Bestimmung für die Aktualisierung eines ViewModel für Änderungen an das Modell gesehen - der Punkt der ViewModel ist, dass es vom Modell isoliert ist. Es behält eine separate Kopie der Daten. Es überträgt die Änderungen nicht an das Modell zurück, nicht bevor Sie eine Schaltfläche "Speichern" drücken. Wenn Sie also stattdessen abbrechen, hat sich im Modell nichts geändert und es gibt nichts rückgängig zu machen.
Möglicherweise versuchen Sie zu sehr, das ViewModel mit dem Model auf dem neuesten Stand zu halten - in den meisten Fällen, wie z.B. beim Speichern oder Laden, können Sie das aktuelle ViewModel einfach wegwerfen und ein neues aus dem aktuellen Zustand des Models erstellen. Müssen Sie den UI-Status des ViewModels beibehalten und die Daten darin ändern? Das ist keine übliche Anforderung, aber es könnte mit einer oder zwei Methoden geschehen, die aufgerufen werden, wenn das Speichern oder Laden geschieht.
Es ist also davon auszugehen, dass diese Verkabelungslogik irgendwo stattfindet. Das ist der Grund, warum die meisten Muster, die Ansichten beinhalten auch Kontrolleure die für das Ausführen von Befehlen (z. B. einen Kunden anzeigen, einen Kunden speichern) und das anschließende Einrichten eines neuen UI-Zustands verantwortlich sind.