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

时间:2017-10-19 22:01:18

标签: wpf xaml routed-events

我正在尝试通过使用RoutedEvent将其连接到命令来构建UserControl我构建的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是否适用于冒泡事件?

我的RoutedEvent:

    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); }
    }

1 个答案:

答案 0 :(得分:3)

通常,路由事件系统允许任何路由事件的处理程序附加到任何UIElementContentElement。这就是路由事件的工作原理。

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

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

  1. 如果设置了SourceObject的{​​{1}}属性,请尝试获取该对象。如果它不为空,请使用它。
  2. 如果设置了EventTrigger SourceName,请使用命名对象解析器获取对象。
  3. 否则,请使用EventTrigger直接附加到的关联对象。
  4. EventTrigger必须是简单的事件名称。不支持完全限定的事件名称(即EventName)。这与Type.EventName形成对比,您可以在System.Windows.EventTrigger属性中指定完全限定的路由事件名称。

    简而言之,您无法以这种方式简化RoutedEvent。 也许您可以使用WrapPanel ItemsControl作为WrapPanel,并定义包含ItemsPanel DataTemplate的{​​{1}}。

相关问题