Angenommen, ich habe eine Klasse namens Customer
. Jetzt muss ich den Kunden im Blick haben. Also habe ich CustomerViewModel
für die Bindung erstellt. Ich suche nach dem besten Weg, die CustomerViewModel
-Klasse zu erstellen. Im Folgenden sind meine Gedanken über das Erstellen.
1 - Erstellen Sie alle Eigenschaften im Kunden erneut auf dem Ansichtsmodell. Injizieren Sie die Kundeninstanz in das Ansichtsmodell, und jede Eigenschaft ruft den Wert dieses Kundenobjekts ab. Der Vorteil dieser Methode ist, dass ich eine gemeinsame Basisklasse für alle Ansichtsmodelle erstellen kann und dort eine gemeinsame Funktionalität abgelegt habe. Nachteil wird die Zeit sein, die erforderlich ist, um alle Eigenschaften erneut auf dem Ansichtsmodell zu erstellen und die Wartung durchzuführen.
2 - Leiten Sie das Ansichtsmodell vom Kunden ab. So habe ich alle Eigenschaften des Kunden im Blick Modell. Aber dies erlaubt mir nicht, eine gemeinsame Basisklasse zu verwenden und dort eine gemeinsame Logik des Anzeigemodells zu setzen.
Also frage ich mich, was die beste Methode ist, um ein View-Modell zu erstellen? Gibt es alternative Methoden, die besser sind als das, was ich dachte?
Sie sollten Josh Smiths Artikel über MVVM lesen.
Er hat auch ein Framework namens MVVM Foundation mit einer ViewModel-Basisklasse. Im Allgemeinen denke ich, dass die Art und Weise, wie er ViewModels implementiert, das Beste ist.
Option 1 ist viel besser. Der Grund ist, dass Sie diese beiden Schichten unabhängig variieren können. Eine enge Kopplung zwischen Ihrem Domänenmodell und Ihrem Ansichtsmodell führt zu einer Starrheit in Ihrem Entwicklungsprozess, die Sie vermeiden möchten.
Die Art, wie ich damit umgehe, so viel Code schreiben zu müssen, ist, dass ich es nicht tue. Ich verwende T4-Vorlagen , einige sinnvolle Konventionen (Eigenschaften, die standardmäßig im Ansichtsmodell angezeigt werden) ; die Domänenmodellklassen implementieren INotifyPropertyChanged
und diese werden nach oben delegiert) und eine Konfigurationsdatei, um die Projektion / Abflachung zu handhaben und die Ansichtsmodelle zu generieren. Ich erzeuge sie auch als Teilklassen, um mit dem Hinzufügen von anderem Code nach Bedarf fertig zu werden.
Wenn Ihre ursprüngliche Kundenklasse die Datenbindung nicht unterstützt, müssen Sie eine Viewmodel-Klasse erstellen und die Eigenschaften der Customer-Klasse replizieren.
Wenn Ihre Customer-Klasse jedoch bereits Unterstützung für die Datenbindung implementiert (sie verfügt entweder über Abhängigkeitseigenschaften ODER implementiert INotifyPropertyChanged), gibt es keinen grundlegenden Grund, warum Sie nicht direkt an die Eigenschaften der Customer-Klasse binden können.
Sie können natürlich noch andere Überlegungen anstellen - Sie möchten vielleicht, dass Ihr Ansichtsmodell bestimmte Operationen als Reaktion auf Eigenschaftenänderungen ausführt, oder Sie möchten nicht, dass Kundenobjekte direkt geändert werden. In diesem Fall möchten Sie die Customer-Klasse dennoch umbrechen.
Vielleicht möchten Sie auch die Datenvalidierung über die IDataErrorInfo-Schnittstelle unterstützen. Wenn Ihre Kundenklasse diese Schnittstelle nicht implementiert, müssen Sie sie wahrscheinlich ebenfalls umbrechen.
Tags und Links .net mvvm design-patterns