Ich denke gerne so:
Ansichten sind, wie Sie sagen, dumm. Josh Smith, Autor des wegweisenden und oft verlinkten MSDN-Artikels über MVVM, sagte, dass Ansichten "die Kleidung sind, die Daten tragen". Ansichten enthalten niemals Daten oder bearbeiten diese direkt. Sie sind lediglich an Eigenschaften und Befehle Ihrer Ansichtsmodelle gebunden.
Modelle sind Objekte, die die Domäne Ihrer Anwendung wie in Geschäftsobjekten modellieren . Ist Ihre Anwendung ein Musikgeschäft? Vielleicht sind Ihre Modellobjekte Künstler, Alben und Lieder. Ist Ihre Anwendung ein Organigramm-Browser? Vielleicht sind Ihre Modellobjekte Manager und Mitarbeiter. Diese Modellobjekte beziehen sich nicht auf irgendeine Art von visuellem Rendering, und sie stehen nicht einmal in direktem Zusammenhang mit der Anwendung, in die Sie sie einfügen. Ihre Modellobjekte sollten als eine Familie von Objekten, die irgendeine Art darstellen, für sich genommen völlig sinnvoll sein der Domain. Die Modellschicht enthält normalerweise auch Dinge wie Service-Accessoren.
Dies bringt uns zu Viewmodels. Was sind Sie? Dies sind Objekte, die eine GUI-Anwendung modellierenDies bedeutet, dass sie Daten und Funktionen bereitstellen, die von Ansichten verwendet werden können. Sie definieren die Struktur und das Verhalten der tatsächlichen Anwendung, die Sie erstellen. Für die Modellobjekte ist die Domäne die Domäne, die Sie auswählen (Musikspeicher, Organigramm-Browser usw.). Für das Ansichtsmodell ist die Domäne jedoch eine grafische Anwendung. Ihre Ansichtsmodelle werden das Verhalten und die Daten von allem, was Ihre Anwendung tut, zusammenfassen. Sie werden Objekte und Listen als Eigenschaften sowie Dinge wie Befehle verfügbar machen. Ein Befehl ist nur ein Verhalten (im einfachsten Fall ein Methodenaufruf), das in ein Objekt eingebunden ist, das ihn herumträgt. Diese Idee ist wichtig, da Ansichten durch Datenbindung gesteuert werden, die Objekte mit visuellen Steuerelementen verbindet. In MVVM geben Sie einer Schaltfläche keine Click-Handler-Methode.
Für mich waren die verwirrendsten Dinge die folgenden:
- Obwohl die Ansichtsmodelle Modelle einer grafischen Anwendung sind, verweisen sie nicht direkt auf visuelle Konzepte oder verwenden diese nicht. Sie möchten beispielsweise keine Verweise auf Windows-Steuerelemente in Ihren ViewModels - diese Dinge werden in der Ansicht angezeigt. ViewModels setzen Daten und Verhaltensweisen einfach Steuerelementen oder anderen Objekten aus, die an sie gebunden werden. Beispiel: Haben Sie eine Ansicht mit einer ListBox? Ihr Ansichtsmodell wird mit ziemlicher Sicherheit eine Sammlung enthalten. Hat Ihre Ansicht Schaltflächen? Ihr Ansichtsmodell wird mit ziemlicher Sicherheit einige Befehle enthalten.
- Es gibt einige Arten von Objekten, die als "Ansichtsmodelle" betrachtet werden können. Das am einfachsten zu verstehende Ansichtsmodell ist eines, das ein Steuerelement oder einen Bildschirm in einer 1: 1-Beziehung direkt darstellt, wie in "Bildschirm XYZ verfügt über ein Textfeld, ein Listenfeld und drei Schaltflächen. Das Ansichtsmodell benötigt also eine Zeichenfolge, eine Sammlung, und drei Befehle. " Eine andere Art von Objekt, die in die Ansichtsmodellebene passt, ist ein Wrapper um ein Modellobjekt, der ihm Verhalten verleiht und es für eine Ansicht benutzerfreundlicher macht. Hier gelangen Sie zu den Konzepten der "dicken" und "dünnen" Ansichtsmodellebenen. Eine "dünne" Ansichtsmodellebene ist eine Reihe von Ansichtsmodellen, die Ihre Modellobjekte direkt für die Ansichten verfügbar machen. Dies bedeutet, dass die Ansichten direkt an Eigenschaften der Modellobjekte gebunden werden. Dies kann beispielsweise für einfache, schreibgeschützte Ansichten funktionieren. Aber was ist, wenn Sie jedem Objekt ein Verhalten zuordnen möchten? Sie möchten das nicht im Modell, da das Modell nicht mit der Anwendung zusammenhängt, sondern nur mit Ihrer Domain. Sie können es in ein Objekt einfügen, das Ihr Modellobjekt umschließt und verbindungsfreundlichere Daten und Verhaltensweisen bietet. Dieses Wrapper-Objekt wird auch als Ansichtsmodell betrachtet. Wenn Sie es haben, entsteht eine "dickere" Ansichtsmodell-Ebene, in der Ihre Ansichten niemals direkt an irgendetwas in einer Modellklasse gebunden werden. Sammlungen enthalten Ansichtsmodelle, die Modelle umschließen, anstatt nur Modelle selbst zu enthalten. Sie können es in ein Objekt einfügen, das Ihr Modellobjekt umschließt und verbindungsfreundlichere Daten und Verhaltensweisen bietet. Dieses Wrapper-Objekt wird auch als Ansichtsmodell betrachtet. Wenn Sie es haben, entsteht eine "dickere" Ansichtsmodellebene, in der Ihre Ansichten niemals direkt an irgendetwas in einer Modellklasse gebunden werden. Sammlungen enthalten Ansichtsmodelle, die Modelle umschließen, anstatt nur Modelle selbst zu enthalten. Sie können es in ein Objekt einfügen, das Ihr Modellobjekt umschließt und verbindungsfreundlichere Daten und Verhaltensweisen bietet. Dieses Wrapper-Objekt wird auch als Ansichtsmodell betrachtet. Wenn Sie es haben, entsteht eine "dickere" Ansichtsmodellebene, in der Ihre Ansichten niemals direkt an irgendetwas in einer Modellklasse gebunden werden. Sammlungen enthalten Ansichtsmodelle, die Modelle umschließen, anstatt nur Modelle selbst zu enthalten.
Das Kaninchenloch geht tiefer - es gibt viele Redewendungen wie ValueConverters, die MVVM am Laufen halten, und es gibt eine Menge zu beachten, wenn Sie über Dinge wie Mischbarkeit, Tests und das Weitergeben von Daten in Ihrer App nachdenken und dies sicherstellen Jedes Ansichtsmodell hat Zugriff auf das Verhalten, das es benötigt (hier kommt die Abhängigkeitsinjektion ins Spiel), aber hoffentlich ist das Obige ein guter Anfang. Der Schlüssel besteht darin, Ihre visuellen Elemente, Ihre Domäne sowie die Struktur und das Verhalten Ihrer tatsächlichen Anwendung als drei verschiedene Dinge zu betrachten.