WPF: Wie kann man das Kontrollkästchen verhindern. Überprüftes Ereignis daran, für Combobox als ToggleButton gefeuert zu werden?

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

Frage

Ich habe viele Steuerelemente in einem Fenster, einschließlich Kontrollkästchen und Comboboxen. Ich möchte das Kontrollkästchen verfolgen.

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

Das Problem ist, dass das gleiche Ereignis auch von Combobox gleich nach dem Klicken der Maus auf ein Element abgefeuert wird. Ich dachte, mein Event -Handler sollte das geprüfte Ereignis von Checkbox nur erfassen, nicht um ToggleButton. Habe ich etwas vergessen?

Bearbeiten: Wie ich unten betonte, dachte ich, es würde so funktionieren, weil ich gelesen habe Matthew MacDonald's Buchen "Pro WPF in C# 2010". Auf Seite 164, Er gab diesem Beispielcode zuerst:

<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>  

Dann bemerkte er speziell:

Beachten Sie, dass das Klickereignis tatsächlich in der Schaltflächenklasse definiert und von der Schaltflächenklasse geerbt wurde. Wenn Sie einen Ereignishandler an buttonbase.click anschließen, wird dieser Ereignishandler verwendet, wenn ein durch Button Base abgeleiteter Steuerelement geklickt wird (einschließlich der Schaltfläche, Radiobutton und Kontrollkästchen). Wenn Sie einen Ereignishandler an Button.click anschließen, wird er nur für Tastenobjekte verwendet.

Habe ich ihn jetzt falsch verstanden oder ist seine Notiz falsch?

War es hilfreich?

Lösung

Es gibt eigentlich keine separate CheckBox.Checked Veranstaltung. Wenn Sie sich diese Seite ansehen:

und finde das Checked Ereignis werden Sie sehen, dass es von geerbt wird ToggleButton Also ToggleButton.Checked und CheckBox.Checked sind zwei verschiedene Namen für das gleiche Ereignis.

Da Sie sich für ein "Wildcard" -Event abonnieren, können Sie den Absender oder die Quelle im Event -Handler überprüfen, um Sie zu sehen, an dem Sie interessiert sind.

Bearbeiten:

Um Ihre folgende Frage zum Buchzitat zu beantworten, denke ich, dass das Zitat zumindest irreführend ist. Hier ist ein Gegenbeispiel, das a zeigt CheckBox reagieren auf Button Ereignis obwohl CheckBox ist nicht abgeleitet von Button:

<CheckBox Button.Click="CheckBox_Click"/>

Natürlich gibt es keine Button.Click Ereignis nur a ButtonBase.Click Ereignis, aber das ist der Kern des Zitats. Wenn das Zitat buchstäblich wahr wäre, wäre entweder diese Syntax nicht erlaubt oder das Ereignis würde nicht ausfeuern, von denen keiner wahr ist.

Andere Tipps

Es liegt daran Checkbox.Checked Routed Event wird auf die Veranstaltung reagieren. In Ihrem Fall kommt es vor, dass die ComboboxItem Verwendet das gleiche Routed -Ereignis (und ich bin sicher, dass andere Steuerelemente es wahrscheinlich auch wiederverwenden).

Der einfachste Weg, dies zu bewältigen, wäre, Ihrem Handler einen Test hinzuzufügen, so ähnlich:

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

Dies geschieht, weil beide Ereignisse den Elementbaum aufsprudeln und beide Ihren Handler erreichen (CheckBox Erben ToggleButton, somit CheckBox.Checked und ToggleButton.Checked sind in der Tat die gleichen Ereignisse). Sie können dies nicht verhindern. Was Sie stattdessen tun können, ist zu prüfen, ob die Veranstaltung von a angehoben wurde CheckBox. Es kann so gemacht werden:

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

    // Your handling code         
}

Ich bin der Autor von "Pro WPF in C# 2010" und kann bestätigen, dass der Text aus dem Notizfeld unter das "Was rauchte ich?" Kategorie. Es gibt keine Unterscheidung zwischen dem Click -Ereignis, basierend darauf, wie Sie sich in Ihrem Markup darauf beziehen.

Matthew

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top