2017-10-19 356 views
2

我試圖通過使用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); } 
    } 

回答

2

通常情況下,路由事件系統允許任何路由事件處理程序連接到任何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