WPF RoutedEvent(通过EventManager.RegisterClassHandler)

时间:2010-11-25 16:51:07

标签: wpf routedevent

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

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

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

因此,上面的代码行似乎连接了从Selector base派生的所有控件的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));

问题是我点击了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

1 个答案:

答案 0 :(得分:2)

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