微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

silverlight – SL4 / MVVM:在VM中处理带有void Foo()的MouseDragElementBehavior.Dragging事件

我试图在我拥有的控件上处理MouseDragElementBehavior.Dragging事件.有关我为什么要这样做的背景,请参阅 here.

我无法接通此事件.从XAML中您可以看到我已向用户控件添加一个行为.然后我尝试通过CallMethodAction EventTrigger向行为的Dragging事件添加一个处理程序.

<i:Interaction.Behaviors>
    <ei:MouseDragElementBehavior ConstrainToParentBounds="True">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Dragging">
                <ei:CallMethodAction MethodName="NotifyChildrenYouAreDragging" Targetobject="{Binding}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </ei:MouseDragElementBehavior>
</i:Interaction.Behaviors>

我试过以下方法签名没有运气:

void NotifyChildrenYouAreDragging(){}
void NotifyChildrenYouAreDragging(object sender,EventArgs e){}
void NotifyChildrenYouAreDragging(object sender,MouseEventArgs e){}

任何人都有使用触发器处理附加行为事件的经验吗?

解决方法

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

因此,您可以看到,如果触发器的关联对象是行为,则它将关联对象设置为行为的关联对象,即对象集合. items集合没有拖动事件,所以什么都没有被触发.

您可以通过创建另一个检查相关对象是否具有拖动行为的行为来获得所需的结果,如果是,则将您的行为附加到拖动事件.然后从那里调用对象上的方法.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐