WPF ICommand vs RoutedCommand

Avons une propriété de Command bouton liée à une commande personnalisée.

Quand dois-je implémenter ICommand et quand dériver de RoutedCommand ? Je vois que RoutedCommand implémente ICommand .

Dans quel cas pourrais-je avoir besoin d’une ICommand ? Qu’en est-il du modèle MVVM? Lequel convient le mieux à cette fin?

Comme vous l’avez remarqué, la classe RoutedCommand est une implémentation de l’interface ICommand , sa principale distinction si sa fonction est similaire à celle d’un RoutedEvent :

Les méthodes Execute et CanExecute sur une RoutedCommand ne contiennent pas la logique d’application pour la commande, comme c’est le cas avec une ICommand classique, mais plutôt, elles déclenchent des événements qui traversent l’arborescence d’éléments à la recherche d’un object CommandBinding. Les gestionnaires d’événements attachés à CommandBinding contiennent la logique de commande.

La méthode Execute déclenche les événements PreviewExecuted et Executed. La méthode CanExecute déclenche les événements PreviewCanExecute et CanExecute.

Dans le cas où vous ne voulez pas le comportement de la RoutedCommand vous allez examiner votre propre implémentation d’ ICommand . En ce qui concerne le modèle MVVM, je ne peux pas dire que cette solution existe, il semble que tout le monde ait sa propre méthodologie. Cependant, voici quelques approches à ce problème que j’ai rencontrées:

  • Utilisation de RoutedCommands avec un ViewModel dans WPF
  • Relais logique de commande
  • Commande simple (presque identique à la commande de relais, mais qui mérite d’être lue)

La seule chose que je voudrais append à la réponse de Rich McGuire est que les commandes RoutedCommands (et leur descendance RoutedUICommand, plus répandue, doivent être connectées à des gestionnaires d’événements pour fonctionner correctement).

La plupart des implémentations MVVM que j’ai rencontrées tentent de tirer parti de la liaison avec ViewModel et, par conséquent, ViewModel (et non la vue) possède la logique CanExecute / Execute.

En revanche, les gestionnaires d’événements déplacent cette charge vers la vue. Le traitement peut ensuite être propagé au ViewModel, mais cela signifie un degré de couplage légèrement supérieur entre ViewModel et View (conversion + appel de méthode, etc.).