Ich gehe einige MVVM-Artikel durch, hauptsächlich dies und das .
Meine spezielle Frage lautet: Wie kommuniziere ich Modelländerungen vom Modell zum ViewModel?
In Joshs Artikel sehe ich nicht, dass er das tut. Das ViewModel fragt das Modell immer nach Eigenschaften. In Rachels Beispiel lässt sie das Modell implementierenINotifyPropertyChanged
und löst Ereignisse aus dem Modell aus, die jedoch von der Ansicht selbst verwendet werden sollen (weitere Informationen dazu, warum sie dies tut, finden Sie in ihrem Artikel / Code).
Nirgendwo sehe ich Beispiele, in denen das Modell das ViewModel über Änderungen an Modelleigenschaften informiert. Das hat mich beunruhigt, dass es vielleicht aus irgendeinem Grund nicht gemacht wird. Gibt es ein Muster, um das ViewModel über Änderungen im Modell zu informieren? Dies scheint notwendig zu sein, da (1) möglicherweise mehr als 1 ViewModel für jedes Modell vorhanden ist und (2) selbst wenn nur ein ViewModel vorhanden ist, eine Aktion des Modells dazu führen kann, dass andere Eigenschaften geändert werden.
Ich vermute, dass es Antworten / Kommentare des Formulars "Warum sollten Sie das tun wollen?" Gibt. Kommentare, also hier eine Beschreibung meines Programms. Ich bin neu bei MVVM, daher ist mein gesamtes Design möglicherweise fehlerhaft. Ich werde es kurz beschreiben.
Ich programmiere etwas, das (zumindest für mich!) Interessanter ist als die Klassen "Kunde" oder "Produkt". Ich programmiere BlackJack.
Ich habe eine Ansicht, die keinen Code enthält und sich nur auf die Bindung an Eigenschaften und Befehle im ViewModel stützt (siehe Josh Smiths Artikel).
Für besser oder schlechter, nahm ich die Haltung , dass das Modell nicht nur Klassen wie enthalten PlayingCard
, Deck
sondern auch die BlackJackGame
Klasse , den Zustand des ganzen Spiels hält, und weiß , wann der Spieler gegangen Büste hat, die Dealer Karten zu ziehen haben, und Wie hoch ist die aktuelle Punktzahl des Spielers und Dealers (weniger als 21, 21, Fehlschlag usw.)?
Aus BlackJackGame
Ich stelle Methoden wie "DrawCard" zur Verfügung und es kam mir der Gedanke, dass beim Ziehen einer Karte Eigenschaften wie CardScore
und IsBust
aktualisiert werden sollten und diese neuen Werte an das ViewModel übermittelt werden sollten. Vielleicht ist das falsches Denken?
Man könnte die Haltung einnehmen, dass das ViewModel die DrawCard()
Methode aufgerufen hat , also sollte er wissen, ob er nach einer aktualisierten Punktzahl fragen und herausfinden muss, ob er pleite ist oder nicht. Meinungen?
In meinem ViewModel habe ich die Logik, ein tatsächliches Bild einer Spielkarte (basierend auf Farbe, Rang) zu erfassen und für die Ansicht verfügbar zu machen. Das Modell sollte sich nicht damit befassen (möglicherweise würde ein anderes ViewModel nur Zahlen anstelle von Kartenbildern verwenden). Natürlich werden mir vielleicht einige sagen, dass das Modell nicht einmal das Konzept eines BlackJack-Spiels haben sollte und dass dies im ViewModel behandelt werden sollte?
OnBust
verfügbar machen und die VM kann es abonnieren. Ich denke, Sie könnten auch einen IEA-Ansatz verwenden.