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.
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