WPF: ¿Cómo evitar la casilla de verificación. Evento marcado para ser despedido para Combobox como un mochila?

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

Pregunta

Tengo muchos controles en una ventana que incluye casillas de verificación y Comboboxes. Quiero rastrear checkbox.isChecked Event, así que definí un controlador de eventos en el nivel de Windows como

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

El problema es que Combobox también dispara el mismo evento justo después de hacer clic en un elemento. Pensé que mi controlador de eventos solo debería capturar el evento marcado de la casilla de verificación, no el de ToggleButton. ¿Yo me perdí algo?

EDITAR: Como señalé a continuación, pensé que funcionaría de esta manera porque leí Matthew MacDonald's libro "Pro WPF en C# 2010". En la página 164, primero dio este código de ejemplo:

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

Entonces, especialmente señaló:

Nota El evento de clics realmente se define en la clase ButtonBase y hereda por la clase de botones. Si adjunta un controlador de eventos a ButtonBase.lick, ese controlador de eventos se usará cuando se haga clic en cualquier control derivado de ButtonBase (incluidos el botón, RadioButton y las clases de casilla de verificación). Si adjunta un controlador de eventos al botón. Haga clic, solo se usa para objetos de botón.

Ahora, ¿lo malinterpreté o su nota está equivocada?

¿Fue útil?

Solución

En realidad no hay un separado CheckBox.Checked evento. Si miras esta página:

y encuentra el Checked Evento que verá que se hereda de ToggleButton asi que ToggleButton.Checked y CheckBox.Checked son dos nombres diferentes para el mismo evento.

Dado que se suscribe a un evento "comodín", en el controlador de eventos puede consultar el remitente o fuente para verlo es uno que le interese.

Editar:

Para abordar su pregunta de seguimiento sobre la cita del libro, creo que la cita es al menos engañosa. Aquí hay un contraejemplo que muestra un CheckBox reaccionar a Button evento aunque CheckBox no se deriva de Button:

<CheckBox Button.Click="CheckBox_Click"/>

Por supuesto que no hay Button.Click evento, solo un ButtonBase.Click Evento, pero ese es el quid de la cita. Si la cita fuera literalmente cierta, esta sintaxis no se permitiría o el evento no dispararía, ninguno de los cuales es cierto.

Otros consejos

es porque está estableciendo el evento en la red, por lo que cualquier niño contenido por la red que tiene un Checkbox.Checked El evento enrutado responderá al evento. En su caso, sucede que el ComboboxItem Utiliza el mismo evento enrutado (y estoy seguro de que otros controles probablemente también lo reutilizan)

La forma más fácil de manejar esto sería agregar una prueba a su manejador, algo como esto:

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

Esto sucede porque ambos eventos se burbujean en el árbol de los elementos y ambos llegan a su manejador (CheckBox hereda ToggleButton, por eso CheckBox.Checked y ToggleButton.Checked de hecho son los mismos eventos). No puedes evitar esto. Lo que puede hacer en su lugar es verificar si el evento fue planteado por un CheckBox. Se puede hacer así:

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

    // Your handling code         
}

Soy el autor de "Pro WPF en C# 2010" y puedo confirmar que el texto del cuadro de notas cae bajo el "¿Qué estaba fumando?" categoría. No hay distinción entre el evento de clic en función de cómo se refiere a él en su marcado.

Mateo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top