wpf - 如何在 WPF 中使用 Interaction.EventTrigger 和冒泡自定义事件

标签 wpf xaml routed-events

我正在尝试处理来自 UserControlRoutedEvent,我通过使用 Interaction.Triggers 将它连接到命令来构建它。以下工作——它调用 AddingNewThingCommand:

<WrapPanel>

    <local:MyCustomUserControl Header="MyHeader1"
                               ItemsSource="{Binding List1}">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="AddingNewThing">
                <prism:InvokeCommandAction Command="{Binding DataContext.AddingNewThingCommand, ElementName=rootViewElement}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </local:MyCustomUserControl >

    <local:MyCustomUserControl Header="MyHeader2"
                               ItemsSource="{Binding List2}">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="AddingNewThing">
                <prism:InvokeCommandAction Command="{Binding DataContext.AddingNewThingCommand, ElementName=rootViewElement}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </local:MyCustomUserControl >

</WrapPanel>

现在我实际上在这个包装面板中有很多这样的用户控件实例,所以我更愿意将交互触发器移动到父元素 -- WrapPanel。以下不起作用:

<WrapPanel>
    <i:Interaction.Triggers>
        <!-- Also tried local:MyCustomUserControl.AddingNewThing -->
        <i:EventTrigger EventName="MyCustomUserControl.AddingNewThing">
            <prism:InvokeCommandAction Command="{Binding DataContext.AddingNewThingCommand, ElementName=rootViewElement}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>

    <local:MyCustomUserControl Header="MyHeader1"
                               ItemsSource="{Binding List1}"/>
    <local:MyCustomUserControl Header="MyHeader2"
                               ItemsSource="{Binding List2}"/>
</WrapPanel>

EventTrigger 是否适用于冒泡事件?

我的路由事件:

    public static readonly RoutedEvent AddingNewThingEvent = EventManager.RegisterRoutedEvent(
        "AddingNewThing", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyCustomUserControl));
    public event RoutedEventHandler AddingNewThing
    {
        add { AddHandler(AddingNewThingEvent, value); }
        remove { RemoveHandler(AddingNewThingEvent, value); }
    }

最佳答案

通常,路由事件系统允许将任何路由事件的处理程序附加到任何UIElement。或 ContentElement .这就是路由事件的工作方式。

然而,System.Windows.Interactivity.EventTrigger不是可视化树的一部分,因此不能参与此路由事件调度。 EventTrigger使用给定的 EventName 直接订阅 CLR 事件(使用反射:Type.GetEvent)。

事件源对象将使用以下顺序确定:

  1. 如果SourceObject EventTrigger 的属性(property)已设置,请尝试获取该对象。如果它不为 null,则使用它。
  2. 如果SourceNameEventTrigger已设置,使用命名对象解析器获取对象。
  3. 否则,使用关联对象 EventTrigger直接连接到。

EventName必须是一个简单的事件名称。不支持完全限定的事件名称(即 Type.EventName )。这与 System.Windows.EventTrigger 形成对比,您可以在其中指定完全限定的路由事件名称 RoutedEvent属性(property)。

简而言之,您无法简化您的 WrapPanel以这种方式。 也许你可以使用 ItemsControlWrapPanel作为ItemsPanel并定义一个 DataTemplate包含你的 MyCustomUserControlEventTrigger

关于wpf - 如何在 WPF 中使用 Interaction.EventTrigger 和冒泡自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46839553/

相关文章:

c# - 在多个复选框上过滤 ICollectionView

silverlight - 当图像是 xaml 中的数据绑定(bind)时清除图像缓存(释放内存)

c# - silverlight 3 中的路由事件?

c# - WPF 获取 UI 线程,或如何从非 UI 线程显示窗口

WPF 文本框中的 SQL 智能感知

c# - WPF 中的图像源

WPF Dockpanel 第一个子项使用剩余空间

c# - 路由事件语法

c# - WPF:缓慢的模板实例化