Verstößt die allgemeine Implementierung von RelayCommand gegen das MVVM-Muster?

8

Eine sehr häufige Implementierung von RelayCommand scheint die folgenden Zeilen zu enthalten:

%Vor%

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?

    
Tim Pohlmann 10.03.2016, 08:04
quelle

1 Antwort

3

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.

    
Tseng 10.03.2016, 08:43
quelle

Tags und Links