Dans toutes les applications, l'utilisateur a besoin d'interagir avec les composants de l'interface graphique. En WinForms, on doit abonner des méthodes à des évènements qui englobent des delegates, afin de les rendre entre autres type-safe. Par exemple, lorsque l'on veut déclencher une tâche, suite au clic de l'utilisateur sur un bouton, on abonne une nouvelle méthode EventHandler à l'event Click. Cependant le pattern MVVM demande qu'il y ait le minimum de (le mieux serai aucun) code behind dans les Views. On ne peut donc s'abonner à un évènement d'une View dans cette architecture. Pour palier à cette contrainte, on fait appel à des Routed Commands qui pourront être bindés dans les vues en langage déclaratif (xaml).

La classe RelayCommand

Cette classe implémente l'interface ICommand qui permet d'être identifiée en tant que commande dans le code xaml. Elle peut être affectée à la propriété Command d'un UIElement adéquat. Une RelayCommand permet de relayer ses fonctionnalités à un autre objet en invoquant des delegates.

La classe comporte 2 propriétés :

  • Une propriété de type Action<object> dans l'assembly System.Core qui est la méthode appelée pour l'exécution de la commande.
  • Une propriété Predicate<object> dans l'assembly System.Core également. Elle représente la méthode qui définit un ensemble de critères et détermine si l'objet spécifié répond à ces critères afin d'exécuter la commande ou non.

Implémentation

Nous allons voir maintenant à quoi ressemble l'implémentation de cette classe.

Dans le projet ViewModelLibrary :

  • Ajouter la référence PresentationCore qui nous permet de disposer de l'interface ICommand et de la classe CommandManager
  • Créer une nouvelle classe RelayCommand et implémenter ICommand.

RelayCommand.bmp

Utilisation

Pour utiliser une commande dans une classe ViewModel et pour pouvoir la binder dans la View associée, on crée simplement une propriété de type ICommand que l'on initialisera dans le constructeur. Voici l'exemple d'un cas d'uilisation :

Exemple_utilisation_RelayCommand.bmp

Notre ActionCommand est une simple propriété, par conséquent, on peut la binder dans un code xaml d'un View :

Exemple_utilisation_RelayCommand_xaml.bmp