In der Model-View-ViewModel (MVVM)-Architektur von WPF ist eine häufige ICommand-Implementierung üblich. Das Erstellen zahlreicher einzelner ICommand-Klassen kann zu sich wiederholendem Code führen. Dieser Artikel bietet eine Lösung für wiederverwendbare ICommand-Implementierungen zur Steigerung der Effizienz.
Ein einfacher Ansatz besteht darin, dass eine einzelne ICommand-Klasse zwei Delegate-Methoden nutzt: eine für Execute
und eine für CanExecute
. Der Konstruktor akzeptiert diese Delegaten und ruft sie innerhalb der ICommand-Methoden auf.
Eine überlegene Alternative, die auf dem ursprünglichen Konzept von Karl Shifflet weiterentwickelt wurde, ist jedoch RelayCommand
.
Die RelayCommand
-Klasse implementiert die ICommand
-Schnittstelle und verwendet Action<T>
und Predicate<T>
für Execute
bzw. CanExecute
. Dies bietet eine kompaktere und anpassungsfähigere Methode für die ICommand-Implementierung.
<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 implementation // ... }</code>
Die Integration von RelayCommand
in ViewModel-Klassen vereinfacht die ICommand-Instanziierung.
<code class="language-csharp">public class MyViewModel { private ICommand _doSomething; public ICommand DoSomethingCommand { get { if (_doSomething == null) { _doSomething = new RelayCommand( p => this.CanDoSomething(), p => this.DoSomeImportantMethod()); } return _doSomething; } } }</code>
Während eine benutzerdefinierte ICommand-Implementierung mit Delegaten funktionsfähig ist, bietet RelayCommand
eine elegantere und flexiblere Lösung. Durch die Einführung von RelayCommand
wird die ICommand-Implementierung in MVVM-Projekten erheblich rationalisiert.
Das obige ist der detaillierte Inhalt vonWie kann ich wiederverwendbare ICommand-Implementierungen im MVVM-Muster von WPF erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!