Eine sehr häufige Implementierung von RelayCommand
scheint die folgenden Zeilen zu enthalten:
Das scheint mir sehr fehlerhaft zu sein, denn CommandManager
ist eine WPF-Komponente und normalerweise befinden sich meine Befehle in einer viewmodel-Klasse. Da das Viewmodel die View nicht kennen sollte und mit anderen Frameworks arbeiten sollte, scheint mir das sehr merkwürdig. Beispielsweise ist diese Implementierung nicht möglich, wenn Sie Ihr Ansichtsmodell in einem zusätzlichen Projekt trennen, das den WPF-Namespace (z. B. PCL) nicht kennt.
Verstößt diese Implementierung gegen das MVVM-Muster?
Oder stellst du das RelayCommand
irgendwie in deine Sicht?
Wenn dies tatsächlich fehlerhaft ist, gibt es eine Best-Practice-Implementierung, die dieses Problem löst?
Dies ist ein einfacher und schneller & amp; Dirty-Implementierung wird meist nur für Tutorial-Fälle verwendet, die das Tutorial nicht an ein bestimmtes MVVM-Framework binden, sondern als generisches Do-it-yourself-MVVM-Tutorial dienen.
Dieser Ansatz hat - abgesehen von einer engen Kopplung - einige andere Nachteile.
Wenn die Methode CommandManager.InvalidateRequerySuggested()
aufgerufen wird, wird die Methode CanExecute
jedes Befehls aufgerufen. Wenn Sie in Ihrer Anwendung über 100 Befehle verfügen, kann dies schwerwiegende Auswirkungen auf die Leistung Ihrer WPF-Anwendung haben.
Ich persönlich empfehle immer ein ausgereiftes MVVM-Framework (Prism ist mein Favorit für LoB-Anwendungen). Dort implementieren die Befehle das normalerweise nicht auf diese Weise, aber Sie rufen MyCommand.OnCanExecuteChanged()
(im Fall von Prism) auf, um CanExecute
validation für einen einzigen -Befehl auszulösen.
Wenn Sie zusammengesetzte oder mehrere Befehle haben, die voneinander abhängen, binden Sie sie selbst in Code ein, dh indem Sie eine Liste verwandter Befehle in der Ansicht, in der sie verwendet werden, speichern und ihre OnCanExecuteChanged()
-Methoden auf a registrieren Multicast-Delegate und rufen Sie stattdessen.
Verstößt diese Implementierung gegen das MVVM-Muster?
Technisch ja.
Oder stellst du vielleicht den RelayCommand irgendwie in deine Sicht?
Nicht wirklich, obwohl Sie vielleicht in der Lage sind, es mit einer externen Fabrik zu abstrahieren, scheint es keinen Sinn zu ergeben (siehe das obige Problem)
Wenn dies tatsächlich fehlerhaft ist, gibt es eine Best-Practice-Implementierung, die dieses Problem löst?
Ich habe sowieso keinen globalen Befehlsstatus. Verknüpfen Sie die Befehle selbst, die ihren Ausführungsstatus benötigen.
Tags und Links wpf c# mvvm relaycommand icommand