Um die Frage zu beantworten, sollte jede Ansicht ein eigenes Ansichtsmodell haben. Es ist jedoch nicht erforderlich, die gesamte Hierarchie zu modellieren. Nur was die Aussicht braucht.
Das Problem, das ich mit den meisten Online-Ressourcen in Bezug auf MVVM hatte:
In den meisten Beispielen handelt es sich bei der Ansicht um eine beinahe 1-zu-1-Zuordnung des Modells. In meinem Szenario, in dem es unterschiedliche Ansichten für verschiedene Facetten desselben Modells gibt, stehe ich jedoch zwischen zwei Optionen fest:
Ein monolithisches Ansichtsmodell, das von allen anderen Ansichtsmodellen verwendet wird
Oder ein Ansichtsmodell für jede Ansicht
Beides ist aber nicht ideal.
Das modellorientierte Ansichtsmodell (MVM) ist trotz seiner geringen Codeduplizierung ein Albtraum
Das ansichtsorientierte Ansichtsmodell (VVM) erstellt für jede Ansicht hochspezialisierte Klassen, enthält jedoch Duplikate.
Am Ende entschied ich, dass eine VM pro View einfacher zu warten und zu programmieren ist, und entschied mich für den VVM-Ansatz.
Sobald der Code funktioniert, habe ich begonnen, alle gängigen Eigenschaften und Operationen in die aktuelle, endgültige Form umzugestalten:
In dieser endgültigen Form ist die gemeinsame Ansichtsmodellklasse in jeder VVM zusammengefasst.
Natürlich muss ich noch entscheiden, was als allgemein / spezialisiert gilt. Und wenn eine Ansicht hinzugefügt / zusammengeführt / gelöscht wird, ändert sich dieser Saldo.
Aber das Schöne daran ist, dass ich jetzt problemlos Up / Down-Mitglieder von Common zu VVM und umgekehrt pushen kann.
Und ein kurzer Hinweis zum Synchronisieren der Objekte:
Ein gemeinsames Ansichtsmodell erledigt das meiste. Jede VVM kann einfach einen Verweis auf dasselbe Common View-Modell haben.
Ich tendiere auch dazu, mit einfachen Callback-Methoden zu beginnen und mich zum Ereignis / Beobachter zu entwickeln, wenn das Bedürfnis nach mehreren Zuhörern entsteht.
Und für wirklich komplexe Ereignisse (dh unerwartete kaskadierende Aktualisierungen) würde ich auf die Verwendung eines Mediators umstellen.
Ich scheue mich nicht vor Code, bei dem ein Kind einen Rückverweis auf sein Elternteil hat. Alles, um den Code zum Laufen zu bringen.
Und wenn sich die Gelegenheit zur Umgestaltung ergibt, würde ich es nutzen.
Die Lektionen, die ich gelernt habe:
- Hässlich / Arbeitscode> Schöner / nicht arbeitender Code
- Es ist einfacher, mehrere kleine Klassen zusammenzuführen, als eine große Klasse aufzulösen