Dans l'architecture Model-View-ViewModel (MVVM) de WPF, l'implémentation fréquente d'ICommand est courante. La création de nombreuses classes ICommand individuelles peut conduire à un code répétitif. Cet article propose une solution pour les implémentations réutilisables d'ICommand afin d'améliorer l'efficacité.
Une approche simple implique une seule classe ICommand exploitant deux méthodes déléguées : une pour Execute
et une pour CanExecute
. Le constructeur accepte ces délégués, en les invoquant dans les méthodes ICommand.
Cependant, une alternative supérieure, raffinée à partir du concept initial de Karl Shifflet, est le RelayCommand
.
La classe RelayCommand
implémente l'interface ICommand
, en utilisant Action<T>
et Predicate<T>
pour Execute
et CanExecute
respectivement. Cela offre une méthode plus compacte et adaptable pour la mise en œuvre d'ICommand.
<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>
L'intégration RelayCommand
dans les classes ViewModel simplifie l'instanciation d'ICommand.
<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>
Bien qu'une implémentation ICommand personnalisée avec des délégués soit fonctionnelle, le RelayCommand
fournit une solution plus élégante et flexible. L'adoption de RelayCommand
rationalise considérablement la mise en œuvre d'ICommand dans les projets MVVM.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!