Frage

Ich arbeite an einer WPF-Anwendung, und ich verstehe den Befehl Muster ziemlich gut, aber ich habe festgestellt, dass es mehrere verschiedene Implementierungen des Befehlsmuster für MVVM. Es gibt Josh Smith-Implementierung in seiner WPF Beispielanwendung, die DelegateCommand von Prism und die CommandBindings Umsetzung.

Meine Frage ist, was ist die beste Praxis allgemein akzeptiert ist, Befehle mit MVVM für den Einsatz? Meine Anwendung verwendet Prism so DelegateCommand uns zur Verfügung steht.

Die Devs in meinem Team streitet über den Ansatz „am besten.“ Manche tun nicht wie die zahlreichen CS-Dateien für jeden Befehl erzeugt, andere bevorzugen, dass alles über CommandBindings verdrahtet werden. Ich bin ratlos. Kann jemand etwas Licht?

War es hilfreich?

Lösung

Zwei Punkte zu beachten:

Die Befehle von verschiedenem MVVM-Frameworks zur Verfügung gestellt, wie das CommandSinkCommand oder SimpleCommand (von Cinch) usw. arbeiten als normale ICommands tun. Insbesondere wird der CanExecute Handler ausgewertet, wenn der WPF glaubt etwas geschehen ist, die eine UI Veränderung verursachen könnten. Sie können dies auch manuell erzwingen durch CommandManager.InvalidateRequerySuggested().

Im Gegensatz dazu sind die DelegateCommands <> von Prism nicht nennen die CanExecute Handler, wenn Sie manuell RaiseCanExecuteChanged() auf den Befehl aufrufen. Wenn Sie möchten, dies ändern, so dass es auch wird ausgelöst, wenn die Befehle normalerweise erneut abgefragt werden, finden Sie den Code in http://compositewpf.codeplex.com/Thread/View.aspx?ThreadId=47338

EDIT:

Zweiter Punkt: Die Befehle von MVVM-Frameworks in der Regel ein Objekt als Befehlsparameter akzeptieren. Im Gegensatz dazu die DelegateCommands <> von Prism stärker typisiert (obwohl man könnte natürlich einen DelegateCommands hat, wenn Sie wollen).

Andere Tipps

Nun -. Ich denke, es ist nicht die Lösung

Die Commandbindings sind nicht prüfbar so einfach und die Einführung eine Abhängigkeit zu WPF-Klassen in dem Viewmodel, die nicht sehr gut ist. So würde ich sie nicht verwenden.

Sowohl DelegateCommand und CommandSinkCommand (Josh Smith-Lösung) sind IMO gute Möglichkeiten. Sie sind nicht wirklich anders und keiner von ihnen ist besser als die andere. Obwohl, ich bemerkte, dass die CommandSink Version nicht immer funktioniert, wenn der Befehl Routing komplexer wird (vor allem, wenn Datatemplates beteiligt ist).

Sie können sogar kombinieren sie: Verwenden Sie DelegateCommand und zusätzlich Josh Smith Version verwenden - so dass Sie die Vorteile beider kombinieren können. Das einzige, was Sie brauchen, sind einige Hilfsklassen -. Nicht wirklich schwer zu implementieren

Viel wichtiger ist consitency in Ihrer Anwendung. Wenn Sie sich entschieden, was Sie verwenden möchten, sollten Sie diese Art und Weise durch Ihre gesamte Anwendung folgen

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