2017-10-19 548 views
2

UserControlRoutedEventを、Interaction.Triggersを使用してコマンドにフックして作成しました。次の作品 - それはAddingNewThingCommandを呼び出します。Interaction.EventTriggerを使用してWPFでカスタムイベントをバブリングする方法

<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> 

イベントトリガーはバブリングイベントで機能しますか?

私のする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

通常は、ルーティングイベントシステムは、任意のルーティングイベントのハンドラがUIElementまたはContentElementいずれかに結合することを可能にします。それがルーティングされたイベントの仕組みです。

ただし、System.Windows.Interactivity.EventTriggerはビジュアルツリーの一部ではないため、このルーティングされたイベントのディスパッチには参加できません。 EventTriggerは、EventName(Reflection:Type.GetEventを使用)でCLRイベントに直接サブスクライブします。

  1. EventTriggerSourceObjectプロパティが設定されている場合は、そのオブジェクトを取得しよう:

    イベントソースオブジェクトは、次の順序を使用して決定されます。ヌルでない場合は、それを使用してください。

  2. EventTriggerSourceNameが設定されている場合は、名前付きオブジェクトリゾルバを使用してオブジェクトを取得します。
  3. それ以外の場合は、EventTriggerが直接接続されている関連オブジェクトを使用してください。

EventNameは単純なイベント名でなければなりません。完全修飾イベント名(Type.EventName)はサポートされていません。これは、System.Windows.EventTriggerとは対照的に、RoutedEventプロパティで完全修飾ルーティングイベント名を指定できます。

簡潔に言えば、あなたはそのようにあなたのWrapPanelを単純化することはできません。 ItemsControlWrapPanelItemsPanelとして使用し、にEventTriggerを含むDataTemplateを定義することができます。

+0

優秀な説明、ありがとうございます! – bzuillsmith

関連する問題