2010-02-17 18 views
9

Also habe ich nach einiger Zeit wieder in MVVM geschaut, wo ich nicht wirklich neue Entwicklungen verfolgt habe und mir aufgefallen ist, dass die Menge an Tutorials/Guides etc. stark gewachsen ist. Die meisten Beispiele/Beispielimplementierungen von MVVM fehlen jedoch, um etwas zu erklären, das mir nicht wirklich klar ist. Alle diese Beispiele sind ziemlich einfach und keiner von ihnen liest etwas aus einer Datenbank/Datei/etc.MVVM Erläuterung: Was gehört zu ViewModel, was gehört zu Model?

Jetzt habe ich zum Beispiel eine lackähnliche Anwendung und ich speichere die Bilder in XAML. Was gehört in das ViewModel, was gehört in das Model?

Funktioniert die Modellversorgung zum Laden/Speichern der Bilder von/in eine XAML-Datei?

Ist das ViewModel an Eigenschaften gebunden, die das Modell darstellt (Farbe, Breite, Position usw.)?

Erfolgt die Validierung im Modell oder im ViewModel?

Antwort

2

Das ViewModel ist die Darstellung des Modells, das für die von Ihnen verwendete Präsentationstechnologie geeignet ist.

In Ihrem Beispiel glaube ich, dass das Modell die Funktionen zum Laden/Speichern der Bilder von/zu einer XAML-Datei nicht bieten würde. Dies würde in einem Datenzugriffsobjekt/-repository durchgeführt werden, das vom ViewModel aufgerufen werden würde, indem es Modellinstanzen als Eingabe nimmt. Dieses Bit ist jedoch oft variabel und hängt davon ab, wie Ihre Model-Klassen aussehen.

Das ViewModel verwendet normalerweise keine Datenbindung. Es stellt das Modell einfach der Ansicht auf eine Weise zur Verfügung, die für die Präsentationstechnologie (View) hilfreich ist. Im Fall von WPF/Silverlight bedeutet das im Grunde, dass es die INotifyPropertyChanged-Schnittstelle implementiert.

Die Validierung wird normalerweise vom View (wie so ziemlich alles) initiiert, im ViewModel durchgeführt, aber oft vom ViewModel an das Model delegiert. Natürlich ist es am besten, Ihre Validierungen während Ihrer Bewerbung nicht zu wiederholen. Der beste Ort für allgemeine Validierungen ist das Modell (siehe IDataErrorInfo). Validierungen, die für Ihr ViewModel spezifisch sind, können jedoch direkt im ViewModel behandelt werden.

+0

Ich denke, Diskussionen sind berechtigt, Datenänderungen, die im Modell passieren, dem ViewModel offen zu legen, damit sie durch normale Datenbindung an den View gebunden und aktualisiert werden können. Wenn Sie an eine Datenschicht denken, würde es Messdaten über den Status der Daten enthalten, die während der Datenpflege abgerufen werden (denken Sie insbesondere an einen Offline-Datenspeicher). Wenn diese Metriken vorhanden sind und sich auf der Model-Ebene ändern, wie würden Sie die Änderungsbenachrichtigung von Model an ViewModel für die Datenbindung an die Ansicht übertragen? – ScottCher

0

Auf der einen Seite könnte ViewModel ein Wrapper für das Model-Objekt sein und es mit Präsentationsdetails erweitern. Wenn Sie beispielsweise Model-Objekt - Pen haben, dann kann PenViewModel IsSelected, IsDragging-Eigenschaften usw. enthalten. Dies ist ViewModel als Wrapper.

Auf der anderen Seite könnte ViewModel eine Abstraktion über View sein, die keinen Verweis auf bestimmte Steuerelemente enthält. Vergessen Sie nicht, dass das Ziel von MVVM Unit-Test ist. So haben Sie zum Beispiel in Ihrer Malanwendung ziehbare Balken. So können Sie diese Funktion mit einem Set von ViewModels abstrahieren: BarViewModel {IsSnapped, Position, IsEnabled}, BrushBarViewModel: BarViewModel, PenBarViewModel usw. Und dann können Sie diese Funktion mit Unit Tests abdecken, aber all diese Sachen haben keine Beziehung zu Model. Dies ist ViewModel als Ansicht Abstraktion.

Modell ist sehr nah an der Geschäftswelt, enthält Business-Entities und Logik, Klassen zu persistieren Entitäten, Dienstleistungen. Sie können verschiedene Konzepte in Ihrem Modell verwenden, z. DDD (Domain-Driven-Design), Fawler-Unternehmensmuster, CQRS (Command Query Responsibility Segregation), SOA (Service Oriented Architecture).

Ansicht Syncronize Zustand mit ViewModel (Model) mit Bindung Mechanismus, schlimmsten Fall in Code hinter wie in PresentationModel Muster.

Bases auf diese, um Ihre Fragen beantworten werde sein wird:

gilt das Modell Versorgungsfunktionen, die Bilder von/zu einer XAML-Datei zu laden/speichern?

Nr Modell keinen direkten Hinweis auf alle XAML-Dateien.

Ist das Ansichtsmodell bindet an Eigenschaften, die das Modell Exposes (Farbe, Breite, Position etc.)?

Nein. Bindung ist Mechanismus der View-Synchronisation. Daher müssen Sie View mit diesen Eigenschaften verknüpfen. Sie können View direkt an Model oder an den ViewModel-Wrapper binden.

Geschieht die Validierung im Modell oder im Ansichtsmodell?

Wo immer. Wenn die Validierung Ihrer Steuerungsunterstützung auf der Ansichtsebene überprüft werden kann, z. DateTimePicker lässt nicht zu, falsches Datum auszuwählen. Sie können benutzerdefinierte Prüflogik in ViewModel schreiben und mit Komponententests abdecken. Außerdem kann die Validierung als zusätzliche Prüfung auf Model-Ebene erfolgen, da Model nicht in einem ungültigen Zustand sein kann.