我正在尝试找到一种通用方法来跟踪当前窗口中任何控件的"已修改"(数据绑定与否)(例如,在典型的"选项"窗口中启用或禁用"应用"按钮.)实际上,我只需要连接几个事件处理程序,如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)
| 归档时间: |
|
| 查看次数: |
3452 次 |
| 最近记录: |