WPF: Comment éviter l'événement CheckBox.Checked d'être congédié pour ComboBox comme ToggleButton?

StackOverflow https://stackoverflow.com/questions/5849353

Question

J'ai beaucoup de contrôles dans une fenêtre, y compris cases à cocher et comboboxes. Je veux suivre l'événement CheckBox.IsChecked, donc je défini un gestionnaire d'événements de niveau Windows comme

<Grid CheckBox.Checked="OnModified" CheckBox.Unchecked="OnModified">

Le problème est que le même événement est également tiré par ComboBox juste après la souris en cliquant sur un élément. Je pensais que mon gestionnaire d'événements ne devrait capturer l'événement vérifié de CheckBox, non ToggleButton de. Ai-je raté quelque chose?

EDIT: Comme je l'ai souligné ci-dessous, je pensais que cela fonctionnerait de cette façon parce que je lis Matthew MacDonald livre " WPF Pro en C # 2010 ". À la page 164 , il a donné ce code premier exemple:

<StackPanel Button.Click="DoSomething" Margin="5">   
  <Button Name="cmd1">Command 1</Button> 
  <Button Name="cmd2">Command 2</Button> 
  <Button Name="cmd3">Command 3</Button> 
  ... 
</StackPanel>  

Ensuite, il a spécialement noté:

Remarque L'événement Click est en fait définie dans la classe ButtonBase et héritée par la classe Button. Si vous joindre un gestionnaire d'événements ButtonBase.Click, ce gestionnaire d'événements sera utilisé lorsqu'une le contrôle ButtonBase dérivé est cliqué (Y compris le bouton, RadioButton, et les classes CheckBox). Si vous attachez un gestionnaire d'événements pour Button.Click, il est utilisé uniquement pour les objets Button.

Maintenant, j'ai mal compris lui, ou est sa mauvaise note?

Était-ce utile?

La solution

Il n'y a pas en fait un événement CheckBox.Checked séparé. Si vous regardez cette page:

et trouver l'événement Checked vous verrez qu'il est héritée de ToggleButton si ToggleButton.Checked et CheckBox.Checked sont deux noms différents pour le même événement.

Puisque vous êtes abonné à un événement « générique », dans le gestionnaire d'événements, vous pouvez vérifier l'expéditeur ou d'une source de vous voir est un qui vous intéresse.

Modifier

Pour répondre à votre suivi sur la question concernant la citation du livre, je pense que la citation est au moins trompeur. Voici un contre-exemple qui montre un CheckBox réagir à l'événement de Button même si CheckBox ne dérive pas de Button:

<CheckBox Button.Click="CheckBox_Click"/>

Bien sûr, il n'y a aucun événement de Button.Click, seul un événement ButtonBase.Click, mais qui est le point crucial de la citation. Si la citation était littéralement vrai, que ce soit cette syntaxe ne serait pas autorisée ou l'événement ne serait pas le feu, ni de ce qui est vrai.

Autres conseils

est parce que vous définissez l'événement sur la grille, de sorte que tous les enfants contenus par la grille qui ont un événement routé Checkbox.Checked réagiront à l'événement. Dans votre cas, il arrive que le ComboboxItem utilise le même événement routé (et je suis sûr que d'autres contrôles réutilisent probablement aussi bien)

la meilleure façon de gérer ce serait d'ajouter un test à votre gestionnaire, quelque chose comme ceci:

private void OnModified(object sender, EventArgs args)
{
    if ( sender is CheckBox )
    {
        CheckBox ckBox = sender as CheckBox;
        // do stuff with ckBox
    }
}

Cela se produit parce que les deux événements se bouillonnait les éléments arbre et à la fois la portée de votre gestionnaire (CheckBox inherits ToggleButton, d'où CheckBox.Checked et ToggleButton.Checked sont en fait les mêmes événements). Vous ne pouvez pas empêcher cela. Ce que vous pouvez faire est au lieu de vérifier si l'événement a été soulevée par un CheckBox. Il peut se faire comme ceci:

private void OnModified(object sender, RoutedEventArgs e)
{
    // Filter the event by its source
    if (e.Source.GetType() != typeof(CheckBox))
        return;

    // Your handling code         
}

Je suis l'auteur de « WPF Pro en C # 2010 » et je peux confirmer que le texte de la zone de note tombe sous le « qu'est-ce que je fume? » Catégorie. Il n'y a pas de distinction entre l'événement Click basé sur la façon dont vous faites référence dans votre balisage.

Matthieu

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top