Frage

Ich verwende das MVVM -Lichtrahmen sowie die Einheit für DI. Ich habe einige verschachtelte Ansichten, die jeweils an ein entsprechendes ViewModel gebunden sind. Die ViewModels sind über die ViewModelloCator -Idee an die Root Control Datacontext der einzelnen Ansicht gebunden, dass Laurent Bugnion in MVVM -Licht eingebracht hat. Dies ermöglicht das Finden von ViewModels über eine statische Ressource und die Steuerung der Lebensdauer von ViewModels über einen Abhängigkeitsinjektionsrahmen, in diesem Fall Einheit. Es ermöglicht auch die Expressionsmischung, um alles in Bezug auf ViewModels zu sehen und sie zu binden.

Wie ich sagte, haben die Ansichten eine gesunde Dosis Nisting, aber die ViewModels wissen nichts über einander. Eine übergeordnete Ansicht bindet über das statische Ressourcenansicht an ihre entsprechende ViewModel (die Unity verwendet, um die Konstruktion und Lebensdauer des ViewModel -Objekts zu steuern). Diese übergeordnete Ansicht enthält eine Benutzersteuerung darin, die eine weitere Unteransichtin ist, die dann auch über den ViewModelloCator über den entsprechenden ViewModel geht. Die ViewModels haben keine Verweise aufeinander oder kennen eine Hierarchie in Bezug aufeinander.

Hier ist ein Beispiel dafür, wie die ViewModels durch Messaging interagieren. Ich habe eine übergeordnete Ansicht, die eine Combobox -Datenstelle für eine Beobachtung in seinem ViewModel hat. Das SelectedItem des Combobox ist ebenfalls an eine Eigenschaft auf dem ViewModel gebunden. Wenn sich die Auswahl der Combobox ändert, dient dies dazu, Aktualisierungen in anderen Ansichten und Unteransichten auszulösen. Derzeit erreichen ich dies über das Messaging -System, das in MVVM -Licht zu finden ist.

Ich frage mich also, was die beste Praxis wäre, Informationen von einem ViewModel zu einer anderen zu erhalten? In diesem Fall muss ich an Sub-ViewModels weitergeben, im Grunde genommen eine Benutzerguid, die den derzeit angemeldeten Benutzer darstellt. Die höchste übergeordnete Ansicht (na ja, ViewModel) wird diese Informationen kennen, aber ich bin mir nicht sicher, wie ich sie in die SubviewModels einbringen kann.

Einige mögliche Ansätze, an die ich denken kann:

  • Sollte das Sub-ViewModel den statischen Ressourcenansichtsmodellocator nach einem Verweis auf dasselbe Objekt fragen, das die übergeordnete Ansicht auf diese Weise verwendet und auf die Eigenschaft zugreifen kann? Es scheint, als ob ViewModels durch die Eigenschaften des anderen nicht sehr sauber sind und sie unnötig miteinander verbinden.

  • Ich verwende bereits Messaging, um die Unteransichten zu benachrichtigen, dass der Benutzer ein neues Element im Combobox ausgewählt hat, und um entsprechend zu aktualisieren. Der im Combobox ausgewählte Objekttyp hängt jedoch nicht direkt mit diesem Datenwert zusammen, den die Subviews benötigen.

War es hilfreich?

Lösung 2

Ich habe beschlossen, die SubviewModels eine Nachricht zu veröffentlichen, in der die erforderlichen Informationen angefordert werden, und dann den übergeordneten VM diesen Nachrichtentyp und das Schlüsseltoken abonnieren. Ich möchte diese Kommunikation nicht überbeanspruchen, aber ich denke, sie wird für ein paar Daten wirksam sein, dass ich Probleme habe, Wege zu finden, um die Sichthierarchie durchzusetzen. Bis zu diesem Zeitpunkt war die meisten Datenübergaben auf Ereignisse reagiert, aber nicht alle Daten können auf diese Weise weitergegeben werden, insbesondere wenn die Daten erfasst werden oder das Ereignis auf einem anderen Bildschirm vor der neuen Ansicht erfolgt wird sogar konstruiert und gelesen, um die Daten zu empfangen.

Ich hatte ein Twitter -Gespräch mit einigen bekannten Namen in diesem Bereich (Glenn Block, John Papa und Rob Eisenberg). Sie schlugen eine Reihe von Dingen wie ein Besuchermuster vor, aber ich war mir nicht sicher, ob dies ohne eine Hierarchie von VMs so gut funktionieren würde. Dies könnte daran liegen, dass mein Design im Gegensatz zu einem ViewModel-First-Ansatz so gut wie ansehnt war. Ein weiterer Vorschlag, der möglicherweise geeignet war, wäre die Änderung meines ViewModellocator- und Abhängigkeitsinjektion, um die Fähigkeit zur Übergabe der Datenwerte zum Sub-VM zum Erstellungszeiten einzubeziehen. Ich hatte ein wenig Probleme, es wegen der statischen Natur der VML vorzustellen, und entschied, dass die Message Request -Lösung, die ich mir ausgedacht habe, vorerst einfacher und einfacher sein würde. Ich werde wahrscheinlich die Lösung überdenken müssen, wenn es zu viele weitere Datenstücke gibt, die in diese Situation fallen.

Andere Tipps

Ich habe im Grunde zwei Ansätze dafür gesehen. Für die allgemeine Cross-VM-Kommunikation funktioniert das Event-Aggregator-Muster hervorragend.

Für Hierarchien von VMs kann die Verwendung eines Besuchermusters jedoch besser sein. Mit einem Besucher können Sie Informationen haben, die durch die Hierarchie fließen, beispielsweise jedem Kind einen Verweis auf die übergeordnete VM automatisch.

Sie können dies auch mit EA tun, aber die Herausforderung besteht darin, genügend Informationen in der Nutzlast der Nachricht zu bestehen, so dass die Kinder wissen, dass sie sich um etwas kümmern sollten.

Was den VM -Locator betrifft, absolut nicht! Das VM -Locator -Zeug ist streng zur Bindung in der Benutzeroberfläche. Es sollte sich nicht außerhalb dieses Kontexts (optimal) auffließen lassen.

Mein Glenn $ .02

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top