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

时间:2011-09-18 14:01:02

标签: silverlight silverlight-4.0 behavior eventtrigger attachedbehaviors

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

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

<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){}

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

1 个答案:

答案 0 :(得分:4)

问题是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集合没有拖动事件,因此不会触发任何内容。

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