2009-12-15 8 views
6

Ich arbeite an einer WPF-App und ich verstehe das Befehlsmuster ziemlich gut, aber ich habe festgestellt, dass es mehrere verschiedene Implementierungen des Befehlsmusters für MVVM gibt. Es gibt Josh Smiths Implementierung in seiner WPF-Beispiel-App, die DelegateCommand von Prism, und die CommandBindings Implementierung.Was ist das akzeptierte Muster für WPF, das in MVVM befiehlt?

Meine Frage ist, was ist die allgemein anerkannte Best Practice für die Verwendung von Befehlen mit MVVM? Meine Anwendung verwendet Prism so DelegateCommand ist für uns verfügbar.

Die Entwickler in meinem Team streiten darüber, welcher Ansatz "der Beste" ist. Einige mögen die zahlreichen .cs-Dateien nicht, die für jeden Befehl generiert werden, andere bevorzugen, dass alles über CommandBindings verdrahtet wird. Ich bin ratlos. Kann jemand etwas Licht abwerfen?

Antwort

2

Zwei Punkte zu beachten:

Die von verschiedenen MVVM Gerüsten versehen Befehle, wie beispielsweise den CommandSinkCommand oder SimpleCommand (von Cinch) usw. arbeitet als normale ICommands tun. Insbesondere wird der CanExecute-Handler ausgewertet, wenn der WPF glaubt, dass etwas passiert ist, was zu einer Änderung der Benutzeroberfläche führen könnte. Sie können dies auch manuell durch CommandManager.InvalidateRequerySuggested() erzwingen.

Im Gegensatz dazu rufen die DelegateCommands <> von Prism den CanExecute-Handler nicht auf, es sei denn, Sie rufen RaiseCanExecuteChanged() für den Befehl manuell auf. Wenn Sie dies so ist es auch gefeuert wird sich ändern wollen, 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 sind die DelegateCommands <> von Prism stärker typisiert (obwohl Sie natürlich einen DelegateCommands haben könnten, wenn Sie möchten).

+0

Ich habe die angenommene Antwort wegen des ausgezeichneten zweiten Absatzes auf Ihre übertragen. Danke für die Eingabe! –

+0

Überprüfen Sie auch MVVMLights RelayCommand, die dem Delegate Command sehr ähnlich ist. – Agies

3

Nun - ich denke, es gibt keine die Lösung.

Die CommandBindings sind nicht so einfach testbar und führen eine Abhängigkeit zu WPF-Klassen im ViewModel ein, die nicht sehr gut ist. Also ich würde sie nicht benutzen.

Sowohl DelegateCommand und CommandSinkCommand (Josh Smiths Lösung) sind gute Wege IMO. Sie sind nicht wirklich verschieden und keiner von ihnen ist dem anderen überlegen. Obwohl ich bemerkte, dass die CommandSink-Version nicht immer funktioniert, wenn das Routing von Befehlen komplexer wird (besonders wenn DataTemplates beteiligt sind).

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

Viel wichtiger ist Konsistenz in Ihrer Anwendung: Wenn Sie entschieden haben, was Sie verwenden möchten, sollten Sie diesen Weg durch Ihre gesamte Anwendung folgen.

Verwandte Themen