Ich arbeite an einer WPF MVVM-Anwendung, bei der ich zwei View1 und View2 mit ihren jeweiligen ViewModels habe. Jetzt möchte ich beim Klicken auf eine Schaltfläche in View1 View1 schließen und View2 mit ViewModel1 öffnen. Außerdem möchte ich einige Daten übergeben, die eine Instanz der Personenklasse an ViewModel2 übergeben, wenn sie von ViewModel1 aus geöffnet werden, um Informationen in View2 anzuzeigen.
Was ist der beste und möglicherweise der einfachste Weg, dies nur innerhalb von ViewModels zu erreichen, würde ich vermeiden wollen, Code für die Navigation im Code hinterher zu schreiben.
Wie wäre es mit dem Mediator-Muster (siehe zum Beispiel dies ) oder schwache Ereignisse? Afaik mehrere MVVM-Frameworks / libs (wie PRISM, Caliburn.Micro, MVVMCross) enthalten bereits den Infrastruktur-Code für diese. Es gibt auch separate Bibliotheken, die unabhängig von einem bestimmten mvvm-Framework sind, wie Appccelerate EventBroker , die Ihnen helfen können, etwas in der von Ihnen gewünschten Weise zu erreichen.
Bei Ereignissen frage ich mich allerdings, ob Sie eine Rückmeldung brauchen, ob das Ereignis "richtig" behandelt wurde oder nicht. Es gibt Möglichkeiten, dies zu erreichen (Ändern des Werts der Ereignisargumente, Behandeln der Ereignissynchronisierung, nach dem Erhöhen des Ereignisses, Überprüfen des Werts der Ereignisargumente), aber sie sind nicht so präzise wie der Rückgabewert einer Methode oder eine Methode, die eine Ausnahme auslöst .
EDIT: Entschuldigung, ich habe gerade festgestellt, dass das zweite View / Viewmodel noch nicht geöffnet ist. Also ist meine "Lösung" nicht (das einfach) anwendbar. Sie müssen die Anweisung "up" in der Ansichtsmodellstruktur übergeben, vielleicht sogar an die Wurzel, wo Sie das neue Ansichtsmodell instanziieren und anzeigen können (in einem neuen Fenster oder als ContentControl in einer vorhandenen Ansicht angezeigt werden).
> Ich habe diese Klasse Messenger
für die Kommunikation zwischen ViewModels erstellt.
Registrieren Sie sich für ein hinzugefügtes Personenobjekt in MainViewModel
:
Um alle registrierten ViewModels über die hinzugefügte Person aus CreatePersonViewModel
zu benachrichtigen:
Quellcode:
%Vor%Verwenden Sie einen winzigen dedizierten Light Message Bus . Es ist kein Teil eines MVVM Frameworks, daher kann es unabhängig verwendet werden. Sehr sehr einfach zu installieren und zu verwenden.