Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf Interactivity.EventTrigger未订阅自定义路由事件_Wpf_Behavior_Eventtrigger - Fatal编程技术网

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

Wpf Interactivity.EventTrigger未订阅自定义路由事件,wpf,behavior,eventtrigger,Wpf,Behavior,Eventtrigger,我在DataTemplate中有一个自定义行为,它引发一个自定义路由事件。我想用TriggerAction(发送消息、调用命令等)处理该事件 但我可以清楚地看出,EventTrigger并没有订阅行为的MyEvent 我尝试过通过绑定设置SourceObject(如图所示),但ElementName绑定似乎不起作用,FindAncestor也不起作用 我尝试从EventTrigger继承并在代码中设置SourceObject,得到的只是StackOverflowException 我尝试过

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


但我可以清楚地看出,EventTrigger并没有订阅行为的MyEvent

  • 我尝试过通过绑定设置SourceObject(如图所示),但ElementName绑定似乎不起作用,FindAncestor也不起作用
  • 我尝试从EventTrigger继承并在代码中设置SourceObject,得到的只是StackOverflowException
  • 我尝试过编写一个自定义EventTrigger,但我要么为每个自定义事件编写一个(如果一切都不顺利,我会这样做),要么我必须找到一种通用方法来处理非通用的
    RoutedEventHandler
    s

我该怎么办?

问题是EventTrigger没有连接到行为的事件。相反,它连接到行为的关联对象的事件。以下是相关的源代码:

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

这里提出了一个相关问题:

我通过编写自己的自定义行为来解决这个问题,该行为触发一个命令(我需要的是命令,而不是您的消息)

你可以在这里的答案中看到我的方法:

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