SL4 / MVVM: Обрабатывать событие MouseDragElementBehavior.Dragging с void Foo () в VM - PullRequest
3 голосов
/ 18 сентября 2011

Я пытаюсь обработать событие MouseDragElementBehavior.Dragging в моем элементе управления.См. здесь , чтобы узнать, почему я хочу это сделать.

У меня проблемы с подключением этого события.Из XAML видно, что я добавил поведение в пользовательский элемент управления.Затем я попытался добавить обработчик к событию Dragging для поведения через 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 Ответ

4 голосов
/ 20 сентября 2011

Проблема в том, что 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);
        }
        ....
  }

Таким образом, вы можете видеть, что если связанный объект триггера представляет собой поведение, то он устанавливает связанный объект в связанный объект поведения, который является вашей коллекцией элементов.У коллекции предметов нет события перетаскивания, поэтому ничего не происходит.

Вероятно, вы можете получить желаемые результаты, создав другое поведение, которое проверяет, имеет ли связанный объект поведение перетаскивания и, если да, то ваше поведение привязано к событию перетаскивания.Затем вызовите метод для объекта оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...