web-dev-qa-db-fra.com

Différence entre la commande Déléguée, la commande relais et la commande routée

Je suis confus au sujet du modèle de commande. Il y a tellement d'explications différentes sur les commandes. Je pensais que le code ci-dessous était délégatecommand, mais après avoir lu sur la commande relay, je suis dans le doute.

Quelle est la différence entre relaycommand, delegatecommand et routedcommand. Est-il possible d'afficher des exemples pertinents pour mon code publié?

class FindProductCommand : ICommand
{
    ProductViewModel _avm;

    public FindProductCommand(ProductViewModel avm)
    {
        _avm = avm;
    }

    public bool CanExecute(object parameter)
    {
        return _avm.CanFindProduct();
    }

    public void Execute(object parameter)
    {
        _avm.FindProduct();
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

}
46
Zaz

Votre classe FindProductCommand implémente l'interface ICommand , ce qui signifie qu'elle peut être utilisée comme une commande WPF . Ce n'est ni un DelegateCommand ni un RelayCommand, ni un RoutedCommand, qui sont d'autres implémentations de l'interface ICommand.


FindProductCommand vs DelegateCommand/RelayCommand

Généralement, lorsqu'une implémentation de ICommand est nommée DelegateCommand ou RelayCommand, l'intention est que vous n'ayez pas à écrire une classe qui implémente le ICommand interface; vous passez plutôt les méthodes nécessaires en tant que paramètres au constructeur DelegateCommand/RelayCommand.

Par exemple, au lieu de toute votre classe, vous pouvez écrire:

ProductViewModel _avm;
var FindPoductCommand = new DelegateCommand<object>(
    (parameter) => _avm.FindProduct(),
    (parameter) => _avm.CanFindProduct()
);

Quelques implémentations de DelegateCommand/RelayCommand:

En relation:


FindProductCommand vs RoutedCommand

Votre FindProductCommand exécutera FindProduct lorsqu'il sera déclenché.

La fonction intégrée de WPF RoutedCommand fait autre chose: elle déclenche un événement routé qui peut être géré par d'autres objets dans l'arborescence visuelle. Cela signifie que vous pouvez attacher une liaison de commande à ces autres objets pour exécuter FindProduct, tout en attachant le RoutedCommand lui-même spécifiquement à un ou plusieurs objets qui déclenchent la commande, par exemple un bouton, un élément de menu ou un élément de menu contextuel.

Quelques réponses SO réponses:

52
Zev Spitz