Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. WPF
  3. Commandes et gestion des événements
Extrait - WPF Développez des applications structurées (MVVM, XAML...) (Nouvelle édition)
Extraits du livre
WPF Développez des applications structurées (MVVM, XAML...) (Nouvelle édition) Revenir à la page d'achat du livre

Commandes et gestion des événements

Commandes

1. Introduction

Le mécanisme de commande (Command) est propre à WPF. En technologie WinForms, la technologie Microsoft qui précédait WPF, un gestionnaire d’événements est en charge de gérer chaque action utilisateur dans l’interface. En pratique, on définissait une méthode en charge de l’action consécutive à l’événement. Si un contrôle veut effectuer une action similaire, il faut redéfinir un autre gestionnaire d’événements qui utilise éventuellement la même méthode. Cette disposition est toujours possible en WPF, mais outre le fait qu’elle n’est pas optimale, elle ne respecte pas MVVM. En effet, dans ce cas, la gestion de l’événement est réalisée côté vue.

Le mécanisme de commande permet de gérer l’événement qui survient dans la vue du côté de la vue-modèle, ce qui renforce la séparation entre le visuel et le métier voulue par MVVM.

L’action qui résulte de la gestion par commande est centralisée dans la vue-modèle. Bindée avec la vue, la commande permet de gérer les diverses conditionnalités (tel contrôle doit être visible, par exemple) côté vue-modèle et non côté vue comme habituellement.

On peut alors envisager la commande en WPF comme le support de ce que l’on pourrait qualifier de « binding des événements ».

2. Premiers éléments de syntaxe

L’interface qui est au cœur du fonctionnement des commandes est ICommand. Cette interface propose deux méthodes à implémenter, Execute et CanExecute :

  • Execute gère l’exécution du fonctionnel proprement dit.

  • CanExecute gère le fait de lancer ou non la méthode Execute compte tenu des différents éléments de contexte ou des aspects fonctionnels.


public interface ICommand 
{ 
    event EventHandler CanExecuteChanged; 
    bool CanExecute(object parameter); 
    void Execute(object parameter); 
}
 

3. Commandes routées

Une disposition de WPF permet d’accéder à des « événements...

Pour aller plus loin avec les commandes

1. Différents types de déclenchements de commandes

Plusieurs manières de déclencher une commande ont déjà été étudiées. Si on tente de les récapituler. On peut :

  • Déclencher une commande en appelant sa méthode Execute (sous réserve bien sûr que la méthode CanExecute l’autorise).

  • Utiliser une propriété de type InputGesture, ce qui revient à dire qu’une action souris ou clavier déclenche la commande.

  • Déclencher la commande par l’intervention d’un objet qui implémente ICommandSource. À ce titre, il possède une propriété Command qu’il est à même de déclencher (pour information, le code de l’interface IcommandSource est présenté ci-dessous).


    public interface ICommandSource 
    { 
        ICommand Command { get; } 
        object CommandParameter { get; } 
        IInputElement CommandTarget { get; } 
    }
 

Cette utilisation de ICommandSource se retrouve de manière implicite dans le fonctionnement de plusieurs contrôles WPF, par exemple, Button, MenuItem ou encore ListBoxItem. En effet, chacun de ces contrôles implémente l’interface ICommandSource et associe alors une source de commande à un événement :

  • Le déclenchement de la commande se fait sur le clic pour Button et MenuItem

  • Il se fait sur le double clic pour le ListBoxItem.

Si l’on se borne à l’exemple du bouton : la classe Button hérite de la classe ButtonBase qui elle même implémente l’interface ICommandSource en associant le déclenchement de la commande à l’événement Click dans la définition de Button. Le code ci-dessous met en évidence l’implémentation évoquée.


 public abstract class ButtonBase : ContentControl, ICommandSource
 

L’exemple suivant propose deux déclenchements de commandes différents :

  • Le premier appelle la méthode Execute sur un clic bouton (ICommandSource).

  • Le second se déclenche via un InputGesture.

MainWindow.xaml...