ich mit dem MVVM Muster zu kämpfen bin fort und bei dem Versuch, ein praktisches Design für kleines/mittleres Projekt zu erstellen, haben eine Reihe von Herausforderungen führen. Eine dieser Herausforderungen besteht darin, herauszufinden, wie man die Vorteile der Entkopplung mit diesem Muster nutzen kann, ohne viel repetitiven, schwer zu wartenden Code zu erstellen.MVVM: Thin Viewmodel und Rich-Modelle
Meine aktuelle Strategie bestand darin, 'reiche' Modellklassen zu erstellen. Sie sind sich vollkommen bewusst, dass sie von einem MVVM-Muster konsumiert werden und implementieren INotifyPropertyChanged, lassen ihre Sammlungen beobachten und wissen, dass sie immer unter Beobachtung stehen. Meine ViewModel-Klassen sind in der Regel sehr dünn und weisen nur Eigenschaften zu, wenn Daten tatsächlich transformiert werden müssen, wobei der Großteil ihres Codes RelayCommand-Handler sind. Views binden sich glücklicherweise entweder direkt an ViewModels oder an Models, je nachdem, ob eine Datenumwandlung erforderlich ist oder nicht. Ich benutze AOP (über Postsharp), um den Schmerz von INotifyPropertyChanged zu lindern, so dass es einfach ist, alle meine Modellklassen auf diese Weise 'reich' zu machen.
Gibt es signifikante Nachteile bei der Verwendung dieses Ansatzes? Kann ich davon ausgehen, dass ViewModel und View so eng miteinander verbunden sind, dass ich, wenn ich eine neue Datenumwandlung für die View benötige, diese einfach zum ViewModel hinzufügen kann?
Externe 'Kräfte' ist eine gute Beschreibung dafür, wie mein Design derzeit funktioniert. Meine VM transformiert das Modell (falls erforderlich) für die Ansicht, aber das Modell kann von der VM, von anderen Modellen oder von einer völlig anderen VM, die mit ihr auf andere Weise interagiert, beeinflusst werden. Wenn eine Tool-Erweiterung einen Draht in meinem Modell hinzufügt, möchte ich, dass alle meine VMs und Ansichten die Verdrahtung beobachten, um die Änderung zu sehen. Ich habe benutzerdefinierte Sammlungen erstellt, die Model ObservableCollections überwachen, um eine spezielle Filterung bereitzustellen (über die reine CollectionView-Filterung hinaus), aber die meiste Zeit binde ich an die Model ObservableCollection. –