WPF RoutedEvent(通过EventManager.RegisterClassHandler)

new*_*man 5 wpf routedevent

我正在尝试找到一种通用方法来跟踪当前窗口中任何控件的"已修改"(数据绑定与否)(例如,在典型的"选项"窗口中启用或禁用"应用"按钮.)实际上,我只需要连接几个事件处理程序,如ComboBox.SelectionChanged或TextBox.TextChanged.在WinForms中,我不得不遍历表单中的所有控件并逐个挂接这些事件,并且它有效.在WPF中,我认为我可以用更少的代码完成它

EventManager.RegisterClassHandler( typeof(MyCtrl)
                                 , ComboBox.SelectionChangedEvent
                                 , new RoutedEventHandler(OnChanged));
Run Code Online (Sandbox Code Playgroud)

使用这一行代码,我可以在MyCtrl中为所有组合框连接comobobox的选择更改事件.但是,我遇到的问题是,如果我正确地看到它,当窗口中有另一个不是组合框但也来自" Selector"的控件时,也会触发此事件.例如,我在同一个窗口上也有一个数据网格(实际上数据网格中没有组合框列),当我选择不同的行时也会触发此事件.

因此,似乎上面的代码行连接了从Selectorbase 派生的所有控件的SelectionChanged事件,而不仅仅是组合框.

这是正确的吗?我怎样才能为所有组合框连接SelectionChanged事件?

编辑更多示例:在同一个控件上,我有一个comboxbox和一个按钮,我想跟踪Button.Click和ComboBox.SelectionChanged事件如下

EventManager.RegisterClassHandler( typeof(MyCtrl)
                                 , ComboBox.SelectionChangedEvent
                                 , new RoutedEventHandler(OnChanged));
EventManager.RegisterClassHandler( typeof(MyCtrl)
                                 , Button.ClickEvent
                                 , new RoutedEventHandler(OnChanged));
Run Code Online (Sandbox Code Playgroud)

问题是我点击了ComboBox下拉按钮后立即获得了Button.Click事件.我怎么能阻止这个?

以下是此活动的一些额外信息:

?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
Run Code Online (Sandbox Code Playgroud)

Pat*_*lug 2

我认为您无法阻止这种情况,因为这些控件重用相同的事件,这通常是一件好事。您可以尝试根据发送者进行过滤,并忽略来自您不感兴趣的控件的调用。