我正在尝试找到一种通用方法来跟踪当前窗口中任何控件(数据绑定(bind)与否)的“修改”(例如,在典型的“选项”窗口中启用或禁用“应用”按钮。)事实上,我只需要连接一些事件处理程序,例如 ComboBox.SelectionChanged 或 TextBox.TextChanged。在 WinForms 中,我必须循环遍历表单中的所有控件并将这些事件一一连接起来,并且它起作用了。在 WPF 中,我认为我可以用更少的代码来完成它,例如
EventManager.RegisterClassHandler( typeof(MyCtrl)
, ComboBox.SelectionChangedEvent
, new RoutedEventHandler(OnChanged));
通过这一行代码,我将能够为 MyCtrl 中的所有组合框连接 comobobox 的选择更改事件。然而,我遇到的问题是,如果我正确地看到它,当窗口中存在另一个不是组合框但也派生自“Selector
”的控件时,也会触发此事件。例如,我在同一窗口上也有一个数据网格(实际上数据网格中没有组合框列),当我选择不同的行时也会触发此事件。
因此,上面的代码行似乎为从 Selector
基派生的所有控件(而不仅仅是组合框) Hook 了 SelectionChanged 事件。
这是对的吗?如何为所有组合框连接 SelectionChanged 事件?
编辑更多示例:在同一个控件上,我有一个组合框和一个按钮,我想跟踪 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
最佳答案
我认为您无法阻止这种情况,因为这些控件重用相同的事件,这通常是一件好事。您可以尝试根据发送者进行过滤,并忽略来自您不感兴趣的控件的调用。
关于WPF RoutedEvent(通过 EventManager.RegisterClassHandler),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4279286/