2009-02-03 4 views
8

ProblemstellungWie kann ich die Kohärenz zwischen Modell und Ansichtsmodell im MVVM-Muster beibehalten?

ich eine sehr grundlegende WPF-Anwendung Ich schreibe den Inhalt einer Konfigurationsdatei zu ändern. Das Datenformat ist eine XML-Datei mit einem Schema. Ich möchte für MVVM es als Lernprojekt verwenden, so habe ich geteilt ordnungsgemäß den Code in

  • Modell: C# Klassen automatisch generiert aus xsd.exe

  • View-Modell : Ansichtsfreundliche Darstellung des Modells.

  • Ansicht: XAML und leerer Code hinter

Ich verstehe, wie das View-Modell können View-Bindung zu einem Kinderspiel. Aber ist das View-Model < -> Modell Semantik nicht sehr umständlich? Xsd.exe generiert C# -Klassen mit Arrays für mehrere XML-Elemente. Auf V-VM-Ebene benötigen Sie jedoch Observable Collections.

Fragen:

Heißt das wirklich ich zwei völlig verschiedene Sammlungstypen die gleichen Daten in Zusammenhang darstellen zu halten haben?

Was ist die Best Practices für die Kohärenz zwischen dem Modell und Aufrechterhaltung des View-Modell?

Antwort

6

Ich bin kein großer Experte, aber ich denke, dass der Fall ist, ja. Die allgemeine Idee ist in der Tat, die Änderung zwischen der Ansicht und dem viewModel über Binding und dann zwischen dem ViewModel und dem Model über Ereignisse (in der Modell -> ViewModel-Richtung) oder Abhängigkeit (in der anderen Richtung) zu propagieren.

Ich weiß nicht, wie Standard das ist, aber mein Verständnis von MVVM ist, dass das ViewModel einen Verweis auf das Modell enthalten sollte, damit das ViewModel den entsprechenden Code auf dem Modell aufrufen kann, wenn der Benutzer die Ansicht ändert. Umgekehrt sollte das Modell bei einer Änderung Ereignisse auslösen, und das ViewModel sollte sich entsprechend aktualisieren (das ViewModel ist ein Beobachter des Modells).

2

@Does das wirklich meine ich zwei völlig verschiedene Sammlungstypen zu halten haben die gleichen Daten in Kohärenz darstellt? ja

denke ich. Es ist ziemlich langweilig, aber es funktioniert ganz gut. Hoffentlich haben wir in Zukunft auch einen Code-Generator, um den ViewModel-Teil zu erstellen.

Karl arbeiten daran: http://karlshifflett.wordpress.com/mvvm/

2

Sie müssen klar ObservableCollections im Ansichtsmodell so, ja, Sie müssen zwei völlig unterschiedliche Sammlungstypen im Modell und in dem Viewmodel.

Ich habe einen Artikel fertig zu/tun rückgängig machen Redo in MVVM, wo Sie eine mögliche Lösung dieses Problems finden. Es verwendet, was ich als die MirrorCollection: eine ObservableCollection abgeleitete Klasse Hexe automatisch seine Elemente aus einer Liste (die Liste des Modells) erhält.

Ich denke, es ist eine interessante Lösung ist, können Sie die Artikel finden hier

Part 1: Using the Viewmodel pattern to provide Undo/Redo in WPF

Part 2: Viewmodelling lists (hier ist die MirrorCollection Definition)

0

Events oder Delegierten in Modell Expose und auf den gleichen Haken Wenn in ViewModel die Werte im Modell über das Ereignis oder die Delegaten an ViewModel und von Viewmodle aus geändert werden, können Sie die Benutzeroberfläche aktualisieren.

Wenn Sie es vom Ansichtsmodell zum Modell so einfach aktualisieren möchten, rufen Sie einfach eine Methode auf, übergeben Sie die neuen Werte

Verwandte Themen