30 votes

Quand utiliser les événements sur les commandes dans WPF?

Salut, j'ai récemment examiné WPF et commencé à en apprendre davantage sur les événements et les commandes. J'utilise généralement des commandes sur les clics de bouton, ce qui provoque l'exécution d'une méthode dans mon "modèle d'affichage".

Est-il possible de faire réagir le bouton à d'autres événements comme l'événement MouseOver en utilisant des commandes? Ou les événements WPF seraient-ils utilisés dans ce cas?

Si des événements WPF doivent être utilisés, l'implémentation du gestionnaire d'événements doit-elle simplement appeler une méthode dans le modèle de vue pour que les préoccupations ne se multiplient pas?

13voto

Firoso Points 2852

C'est une bonne question, et c'est une commune, mais "résolu" (ce qui reste discutable) problème au sein de l'architecture MVVM royaume. Si vous utilisez un framework MVVM, vous êtes susceptible de trouver quelque chose de similaire à la EventToCommand Problème, ici, est l'exemple de la MVVM Light Toolkit.

En bref, cela permet d'associer un événement à une liaison de commande comme ceci:

<Rectangle Fill="White"
       Stroke="Black"
       Width="200"
       Height="100">
<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseEnter">
        <cmd:EventToCommand Command="{Binding TestCommand,
                                      Mode=OneWay}"
           CommandParameter="{Binding Text,
                              ElementName=MyTextBox,
                              Mode=OneWay}"
           MustToggleIsEnabledValue="True" />
    </i:EventTrigger>
</i:Interaction.Triggers>
</Rectangle>

Mise à jour:

Il y a deux autres "raisonnable" des solutions à ce problème:

On utilise le maintenant considéré comme l'héritage "AttachedCommandBehavior" extension trouvé ici.

L'autre est un peu irritant, mais efficace.

  1. Capture d'une commande via fr événement purement dans la vue.
  2. Requête de la DataSource du contrôle de l'Étape
  3. Saisir une chaîne de liaison de la cible identificateur qui dénote de votre commande (peut-être l'aide d'un const string sur la afficher)
  4. Invoquer votre commande sur le modèle de vue par la réflexion et l' passer dans les arguments de la commande.

Cela ressemble brut, mais je suis assez certain, c'est effectivement un peu plus rapide que de simplement en utilisant la commande traditionnelle les liaisons. Afin d'être sûr que j'avais besoin de voir l'IL, et je ne pense pas que c'est important dans ce cas.

/Mise à jour

Je veux noter, cependant, que ce n'est pas toujours une situation idéale. J'ai découvert que le plus souvent, je suis en utilisant EventToCommand pour couvrir un problème de conception. Veuillez considérer ce qui suit:

  • Les événements d'utilisation et du code associé à la poignée de l'Interface Utilisateur liées à des comportements.
  • Envisager la création de contrôles personnalisés qui ont les liaisons de commande le cas échéant, en particulier si vous vous trouvez à l'aide de commandes pour encapsuler event driven bevahior à l'ensemble des données liées qui se reflète ensuite dans la vue. (c'est à dire le réglage d'une valeur de transparence basée sur la proximité d'un contrôle ou quelque chose de similaire)
  • EventToCommand devrait plus susceptible d'être utilisé pour traiter la Commande "-comme" événements " seulement (un double-clic, etc) et non réactif événements (passage de la souris). Cependant rien n'empêche que cette. Mettre en œuvre comme bon vous semble.

Le plus important est peut-être que vous vous rappelez que vous êtes le développeur. Les lignes directrices elles-mêmes ne résout pas les problèmes, mais l'examen des lignes directrices peut apporter la solution à un problème apparent.

6voto

Tim Points 8191

Vous voudrez peut-être jeter un oeil à ce post:

WPF Commandes vs Événements Avantages/Inconvénients

qui parle des différents usages des événements et des commandes.

Aussi loin que les commandes pour d'autres événements, vous devriez jeter un oeil à quelque chose comme EventToCommand dans le cadre de la MVVMLight Trousse à outils, qui vous permet de fixer tout cas à une commande dans votre viewmodel. Très utile, surtout si vous êtes déjà en utilisant MVVM Light (que je recommande fortement).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X