WPF:如何在控件模板中调用自定义AdvComboBox的事件处理器?
解决WPF自定义ComboBox模板中调用控件事件处理器的问题
我最近在开发一个带筛选TextBox和新建Button的自定义WPF ComboBox控件(命名为AdvComboBox),一开始已经在控件类里定义了Search和CreateNew两个事件,但卡在了如何在控件模板里触发这些事件的处理器这个点上。
后来参考了Marco分享的MSDN内容,用路由事件完美解决了这个问题,具体做法可以分成这几步:
第一步:把自定义事件声明为路由事件
在AdvComboBox类里,不再用普通的CLR事件,而是定义路由事件,比如:// 定义Search路由事件 public static readonly RoutedEvent SearchEvent = EventManager.RegisterRoutedEvent( "Search", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AdvComboBox)); // 包装成CLR事件供外部使用 public event RoutedEventHandler Search { add { AddHandler(SearchEvent, value); } remove { RemoveHandler(SearchEvent, value); } } // 同理定义CreateNew路由事件 public static readonly RoutedEvent CreateNewEvent = EventManager.RegisterRoutedEvent( "CreateNew", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AdvComboBox)); public event RoutedEventHandler CreateNew { add { AddHandler(CreateNewEvent, value); } remove { RemoveHandler(CreateNewEvent, value); } }第二步:在控件模板里添加触发控件
在XAML模板里放置用于筛选的TextBox和新建Button,给它们命名以便后续关联逻辑:<ControlTemplate TargetType="local:AdvComboBox"> <StackPanel> <!-- 筛选TextBox --> <TextBox x:Name="SearchTextBox"/> <!-- 新建Button --> <Button x:Name="CreateNewButton" Content="新建"/> <!-- 保留原有ComboBox的核心控件 --> <ToggleButton x:Name="ToggleButton" .../> <Popup x:Name="Popup" .../> </StackPanel> </ControlTemplate>第三步:在控件类里关联模板控件与路由事件
重写OnApplyTemplate方法,找到模板里的控件并绑定触发逻辑,当模板控件的原生事件触发时,主动唤起我们定义的路由事件:public override void OnApplyTemplate() { base.OnApplyTemplate(); var searchTextBox = GetTemplateChild("SearchTextBox") as TextBox; if (searchTextBox != null) { searchTextBox.TextChanged += (s, e) => { // 触发Search路由事件 RaiseEvent(new RoutedEventArgs(SearchEvent, this)); }; } var createNewButton = GetTemplateChild("CreateNewButton") as Button; if (createNewButton != null) { createNewButton.Click += (s, e) => { // 触发CreateNew路由事件 RaiseEvent(new RoutedEventArgs(CreateNewEvent, this)); }; } }
这样一来,当模板里的TextBox文本变化或者Button被点击时,就会触发我们在AdvComboBox类里定义的路由事件,外部使用这个控件时,就可以像处理普通WPF控件事件一样绑定Search和CreateNew的处理器了。
内容的提问来源于stack exchange,提问作者SidAhmed
相关产品推荐
相关产品推荐

