Befehle in einer wiederverwendbaren MVVM-Struktur implementieren
In neueren MVVM-Implementierungen ist die Notwendigkeit mehrerer Befehle entstanden. Um den mühsamen Prozess der Erstellung einer einzelnen ICommand-Klasse zu vereinfachen, wurde ein alternativer Ansatz entwickelt. Die Wirksamkeit und mögliche Verbesserungen müssen jedoch noch diskutiert werden.
Vorgeschlagene Lösung: Generisches ICommand
Um die Befehlserstellung zu integrieren, wird eine generische ICommand-Klasse eingeführt, die Delegaten zum Ausführen und Implementieren ausführbarer Funktionen verwendet. Im Konstruktor dieses ICommand werden zwei Delegate-Methoden zugewiesen. Anschließend ruft die ICommand-Methode die Delegate-Methode auf.
Obwohl die Funktionalität funktioniert, wirft dies die Frage auf, ob dieser Ansatz mit Best Practice vereinbar ist oder ob es eine geeignetere Lösung gibt.
Eine Alternative: RelayCommand
Wie Karl Shifflet gezeigt hat, ist RelayCommand eine sehr empfehlenswerte Methode. Es definiert eine Operation, die beim Aufruf ausgeführt wird.
Beispielimplementierung von RelayCommand:
<code class="language-csharp">public class RelayCommand : ICommand { private readonly Predicate<object> _canExecute; private readonly Action<object> _execute; public RelayCommand(Predicate<object> canExecute, Action<object> execute) { _canExecute = canExecute; _execute = execute; } // ICommand 实现... }</code>
Diese Implementierung vereinfacht die Befehlserstellung, wie im folgenden Beispiel gezeigt:
<code class="language-csharp">public class MyViewModel { public ICommand DoSomethingCommand => new RelayCommand( p => this.CanDoSomething(), p => this.DoSomeImportantMethod()); }</code>
Andere Ressourcen:
• „Patterns – WPF Applications Using MVVM Design Pattern“ von Josh Smith bietet weitere Einblicke in den RelayCommand-Ansatz.
Das obige ist der detaillierte Inhalt vonIst ein generisches ICommand oder RelayCommand der beste Ansatz für wiederverwendbare MVVM-Befehle?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!