Ich benutze das MVVM-Pattern schon seit einiger Zeit, aber ich habe immer noch Probleme in realen Situationen. Hier ist ein anderes: Ich verwende Kommandos und sprudele das Ereignis, das im ViewModel behandelt werden soll. So weit, ist es gut. Aber das Projekt, für das ich MVVM verwende, ist eigentlich eine Klassenbibliothek. Sobald ich den Befehlscode ausgeführt habe, muss ich in der Lage sein, ein Objekt zurück an die aufrufende Anwendung zu senden. Wie werden Möglichkeiten vorgeschlagen?
Speziell: In meiner aufrufenden App habe ich eine XAML-Seite, die direkt an das ViewModel der Bibliothek gebunden ist, das ein Objekt "Thing1" enthält. Wenn auf eine Schaltfläche geklickt wird, wird eine Methode im ViewModel aufgerufen (nennen Sie sie "CopyThing1 ()"). Es kopiert "Thing1", um "Thing2" zu erstellen. Dann muss ich "Thing2" zurück an die aufrufende App senden.
Danke !!!
Obwohl die Informationen über das Commanding klar und korrekt waren, konnte es in meinem Fall nicht angewendet werden, da die erforderliche Antwort in einer aufrufenden Anwendung war, die KEIN MVVM verwendet und es keine UI-Antwort sein sollte. Ich habe Prism untersucht, fand es aber zu komplex für das, was ich gerade brauche. Ich habe damit angefangen, Ereignisse anzuheben und zu bearbeiten, wie hier beschrieben - & gt; WPF MVVM Korrekte Möglichkeit zum Auslösen eines Ereignisses in der Ansicht von ViewModel
Befehle geben keine Werte zurück, sie ändern den Status Ihrer Anwendung. Im Fall von ICommands, die an ViewModels angehängt sind, ist das ziemlich einfach, weil Sie dies tun können, indem Sie einfach das ViewModel mutieren, wenn der Befehl ausgeführt wird.
Mit dem RelayCommand von Josh Smiths ausgezeichnetem MVVM-Artikel :
%Vor% Nachdem Sie myVM.MutateCommand.Execute(new object());
aufgerufen haben, können Sie auf den neuen Wert von myVM.Thing
zugreifen.
Der ideale Ansatz besteht darin, eine neue von ICommand geerbte Klasse wie folgt zu definieren:
%Vor%Beachten Sie, dass Execute2 den Wert genau wie eine normale Funktion zurückgibt. Hier ist, wie man es benutzt.
%Vor%Aufrufe Execute2 statt Execute gibt den Wert zurück.