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

问题描述:

我试图通过使用Interaction.Triggers将它挂接到一个命令来构建UserControl来尝试处理RoutedEvent。下面的作品 - 它会调用AddingNewThingCommand如何在WPF中使用Interaction.EventTrigger和冒泡自定义事件

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

通常情况下,路由事件系统允许任何路由事件处理程序连接到任何UIElementContentElement。这就是路由事件的工作原理。

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

  1. 如果EventTriggerSourceObject属性设置,试图获取对象:

    事件源对象将使用下列顺序确定。如果它不为空,则使用它。

  2. 如果EventTriggerSourceName设置,使用命名对象解析器获取对象。
  3. 否则,使用EventTrigger被直接附接至相关联的对象。

EventName必须是一个简单的事件名称。不支持全限定事件名称(即Type.EventName)。这与System.Windows.EventTrigger相反,您可以在RoutedEvent属性中指定标准路由事件名称。

因此,在短期,你不能简化这样你WrapPanel。 也许你可以使用ItemsControlWrapPanel作为ItemsPanel,并且定义一个DataTemplate,其中包含MyCustomUserControlEventTrigger

+0

优秀的解释,谢谢! – bzuillsmith