2012-04-25 70 views
4

我在DataTemplate內部有自定義行爲,這會引發自定義路由事件。我想用TriggerAction處理該事件(發送消息,調用命令等)。Interactivity.EventTrigger不訂閱自定義路由事件

<Border Background="#01FFFFFF" VerticalAlignment="Center"> 
      <i:Interaction.Behaviors> 
        <Behaviors:MyBehavior> 
         <i:Interaction.Triggers> 
          <i:EventTrigger EventName="MyEvent"> 
            <triggers:SendMessageAction Parameter="ActionTaskAssign" MessageToken="ActionTask" /> 
          </i:CustomEventTrigger> 
         </i:Interaction.Triggers> 
        </Behaviors:DropBehavior> 
       </i:Interaction.Behaviors> 
<!-- .... --> 

但是我可以清楚地告訴,EventTrigger沒有訂閱行爲的MyEvent。

  • 我試過設置從綁定SourceObject(看到here),但結合的ElementName似乎沒有工作,而且也不FindAncestor
  • 我試着從EventTrigger繼承和代碼設置SourceObject,我得到的只是一個StackOverflowException
  • 我試過寫一個自定義的EventTrigger,但我要寫每一個自定義事件(如果所有的地獄打破鬆散,我會),或者我必須找出一個通用的方式來處理非-generic RoutedEventHandler s ...

我該怎麼辦?

回答

1

問題是,EventTrigger沒有連接到行爲的事件。相反,它是連接到行爲的AssociatedObject的事件。下面是相關的源代碼:

protected override void OnAttached() 
{ 
    base.OnAttached(); 
    DependencyObject associatedObject = base.AssociatedObject; 
    Behavior behavior = associatedObject as Behavior; 
    FrameworkElement element = associatedObject as FrameworkElement; 
    this.RegisterSourceChanged(); 
    if (behavior != null) 
    { 
     associatedObject = ((IAttachedObject) behavior).AssociatedObject; 
     behavior.AssociatedObjectChanged += new EventHandler(this.OnBehaviorHostChanged); 
    } 
    .... 

}

一個相關的問題在這裏問: Handle MouseDragElementBehavior.Dragging event with void Foo() in VM

我這跟寫一個觸發關閉命令自己的自定義行爲來解決自己(我需要,而不是你的消息。

你可以在這裏看到我的答案在這裏:

Custom behavior with command