Ich versuche, WPF und das MVVM-Problem zu lernen, habe aber einen Haken bekommen. Diese Frage ist ähnlich, aber nicht ganz dieselbe wie diese (Umgang mit Dialogen in wpf-mit-mvvm) ...
Ich habe ein "Login" -Formular, das mit dem MVVM-Muster geschrieben wurde.
Dieses Formular verfügt über ein ViewModel, das den Benutzernamen und das Kennwort enthält, die mithilfe normaler Datenbindungen an die Ansicht in der XAML gebunden sind. Es hat auch einen "Login" -Befehl, der an die "Login" -Schaltfläche im Formular gebunden ist, auch unter Verwendung der normalen Datenbindung.
Wenn der Befehl "Anmelden" ausgelöst wird, ruft er eine Funktion im ViewModel auf, die ausgelöst wird und Daten über das Netzwerk sendet, um sich anzumelden. Wenn diese Funktion abgeschlossen ist, gibt es zwei Aktionen:
Das Login war ungültig - wir zeigen nur eine MessageBox und alles ist in Ordnung
Der Login war gültig, wir müssen das Login-Formular schließen und es als
DialogResult
...
Das Problem ist, dass das ViewModel nichts über die tatsächliche Ansicht weiß. Wie kann es also die Ansicht schließen und anweisen, ein bestimmtes DialogResult zurückzugeben? Ich könnte etwas Code in das CodeBehind stecken und / oder die Ansicht an das ViewModel weiterleiten, aber das scheint den ganzen Sinn von MVVM völlig zu zerstören ...
Aktualisieren
Am Ende habe ich nur die "Reinheit" des MVVM-Musters verletzt und die Ansicht ein Closed
Ereignis veröffentlichen lassen und eine Close
Methode verfügbar machen lassen . Das ViewModel würde dann einfach aufrufen view.Close
. Die Ansicht ist nur über eine Schnittstelle bekannt und über einen IOC-Container verkabelt, sodass keine Testbarkeit oder Wartbarkeit verloren geht.
Es scheint ziemlich dumm, dass die akzeptierte Antwort bei -5 Stimmen liegt! Während ich mir der guten Gefühle bewusst bin, die man bekommt, wenn man ein Problem löst, während man "rein" ist, bin ich sicherlich nicht der einzige, der glaubt, dass 200 Zeilen mit Ereignissen, Befehlen und Verhaltensweisen nur eine einzeilige Methode vermeiden Der Name "Muster" und "Reinheit" ist ein bisschen lächerlich ....
Close
Methode immer noch die beste Lösung ist. Alles andere in den anderen komplexeren Dialogen ist MVVM und datengebunden, aber es schien nur albern, die riesigen "Lösungen" hier anstelle einer einfachen Methode zu implementieren ...