WPF: come evitare che la casella di controllo. Evento di controllo viene sparato per ComboBox come ToggleButton?

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

Domanda

Ho molti controlli in una finestra che includono caselle di controllo e combobox. Voglio tracciare la casella di controllo.

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

Il problema è che lo stesso evento è anche licenziato da Combobox subito dopo aver fatto clic sul mouse un elemento. Pensavo che il mio gestore di eventi dovesse solo catturare l'evento controllato di Checkbox, non quello di ToggleButton. Mi sono perso qualcosa?

EDIT: Come ho sottolineato di seguito, ho pensato che avrebbe funzionato in questo modo perché ho letto Matthew MacDonald's prenotare "Pro WPF in C# 2010". A pagina 164, ha dato prima questo codice di esempio:

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

Quindi, ha notato in particolare:

Nota L'evento click è effettivamente definito nella classe BOCKSE e ereditato dalla classe dei pulsanti. Se si collega un gestore di eventi a bottonbase. Se si collega un gestore di eventi a pulsante. Fai clic, viene utilizzato solo per gli oggetti pulsanti.

Ora, l'ho frainteso o la sua nota è sbagliata?

È stato utile?

Soluzione

In realtà non c'è un separato CheckBox.Checked evento. Se guardi questa pagina:

e trova il Checked evento vedrai che è ereditato da ToggleButton Così ToggleButton.Checked e CheckBox.Checked sono due nomi diversi per lo stesso evento.

Dato che ti stai iscrivendo a un evento "jolly", nel gestore di eventi puoi controllare il mittente o la fonte per vederti che è uno che ti interessa.

Modificare:

Per rispondere alla tua domanda di follow-on sulla citazione del libro, penso che la citazione sia almeno fuorviante. Ecco un contro-esemplare che mostra un CheckBox reagire a Button evento anche se CheckBox non deriva da Button:

<CheckBox Button.Click="CheckBox_Click"/>

Ovviamente non c'è no Button.Click evento, solo a ButtonBase.Click Evento, ma questo è il punto cruciale della citazione. Se la citazione fosse letteralmente vera, o questa sintassi non sarebbe consentita o l'evento non avrebbe sparato, nessuno dei quali è vero.

Altri suggerimenti

è perché stai impostando l'evento sulla griglia, quindi tutti i bambini contenuti dalla griglia che hanno un Checkbox.Checked L'evento instradato risponderà all'evento. Nel tuo caso, succede che il ComboboxItem Utilizza lo stesso evento inserito (e sono sicuro che probabilmente anche altri controlli lo riutilizzano)

Il modo più semplice per gestirlo sarebbe quello di aggiungere un test al tuo gestore, qualcosa del genere:

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

Questo accade perché entrambi gli eventi vengono gorgogliati nell'albero degli elementi ed entrambi raggiungono il gestore (CheckBox eredita ToggleButton, quindi CheckBox.Checked e ToggleButton.Checked sono in effetti gli stessi eventi). Non puoi impedirlo. Quello che puoi fare invece è verificare se l'evento è stato sollevato da a CheckBox. Può essere fatto così:

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

    // Your handling code         
}

Sono l'autore di "Pro WPF in C# 2010" e posso confermare che il testo della casella di nota rientra nel "cosa stavo fumando?" categoria. Non vi è alcuna distinzione tra l'evento Click in base al modo in cui ti riferisci nel tuo markup.

Matteo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top