Interactivity.EventTrigger未订阅自定义路由事件

时间:2012-04-25 18:03:15

标签: wpf behavior eventtrigger

我在DataTemplate中有一个自定义行为,它会引发一个自定义路由事件。我想用TriggerAction处理该事件(发送消息,调用命令等)。

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

但我可以清楚地说,Eve​​ntTrigger并没有订阅行为的MyEvent。

  • 我尝试过设置SourceObject来绑定(看到here)但是ElementName绑定似乎没有用,FindAncestor也没有用
  • 我尝试从EventTrigger继承并在代码中设置SourceObject,我得到的只是一个StackOverflowException
  • 我尝试过编写一个自定义的EventTrigger,但是我要么为每个自定义事件写一个(如果所有地狱都松了,我会),或者我必须找出一种通用的方法来处理非泛型{{ 1}}Š...

我该怎么办?

1 个答案:

答案 0 :(得分:1)

问题是EventTrigger没有连接到Behavior的事件。相反,它正在连接到Behavior的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