2010-11-25 5 views
5

Estoy tratando de encontrar una forma genérica para rastrear "Modificado" de cualquier control (enlace de datos o no) en la ventana actual (esto es, por ejemplo, para habilitar o deshabilitar el botón Aplicar en un ventana típica de Opciones.) De hecho, solo necesito conectar algunos controladores de eventos como ComboBox.SelectionChanged o TextBox.TextChanged. En WinForms tuve que recorrer todos los controles en el formulario y conectar esos eventos uno por uno, y funcionó. En WPF, pensé que podía lograr que se haga con mucho menos código comoWPF RoutedEvent (a través de EventManager.RegisterClassHandler)

EventManager.RegisterClassHandler(typeof(MyCtrl) 
           , ComboBox.SelectionChangedEvent 
           , new RoutedEventHandler(OnChanged)); 

Con éste código de línea, me gustaría ser capaz de cablear evento de cambio de la selección de comobobox para todos los cuadros combinados en MyCtrl. Sin embargo, el problema que encontré es que, si lo veo correctamente, este evento también se activa cuando hay otro control en la ventana que no es un combobox sino que también se deriva de "Selector". Por ejemplo, también tengo una cuadrícula de datos en la misma ventana (en realidad no hay una columna de cuadro combinado en la cuadrícula de datos), este evento también se activa cuando selecciono una fila diferente.

Parece que la línea de código anterior conecta el evento SelectionChanged para todos los controles derivados de la base Selector, no solo del combobox.

¿Es esto correcto? ¿Cómo puedo conectar el evento SelectionChanged para todos los comboboxes?

edición con más ejemplos: En el mismo control, tengo un comboxbox y un botón y quiero hacer un seguimiento Button.Click y ComboBox.SelectionChanged evento como sigue

EventManager.RegisterClassHandler(typeof(MyCtrl) 
           , ComboBox.SelectionChangedEvent 
           , new RoutedEventHandler(OnChanged)); 
EventManager.RegisterClassHandler(typeof(MyCtrl) 
           , Button.ClickEvent 
           , new RoutedEventHandler(OnChanged)); 

El problema es que tengo Botón .Haga clic en el evento justo después de hacer clic en el botón desplegable ComboBox. ¿Cómo puedo prevenir esto?

Aquí hay alguna información adicional para este evento:

?e.OriginalSource 
{System.Windows.Controls.Primitives.ToggleButton Content: 
      IsChecked:True} 
    base {System.Windows.Controls.Primitives.ButtonBase}: 
      {System.Windows.Controls.Primitives.ToggleButton Content: IsChecked:True} 
    IsChecked: true 
    IsThreeState: false 
?e.RoutedEvent 
{ButtonBase.Click} 
    HandlerType: {Name = "RoutedEventHandler" 
        FullName = "System.Windows.RoutedEventHandler"} 
    Name: "Click" 
    OwnerType: {Name = "ButtonBase" 
       FullName = "System.Windows.Controls.Primitives.ButtonBase"} 
    RoutingStrategy: Bubble 

Respuesta

2

No creo que se puede evitar esto porque esos controles reutilizan los mismos eventos, que es normalmente una buena cosa. Puede intentar filtrar según el remitente e ignorar las llamadas provenientes de controles que no le interesan.

Cuestiones relacionadas