2012-04-01 3 views
2

This question говорит мне, что делать в словах, но я не могу понять, как написать код. :)MVVM, управляющий событиями перетаскивания MouseDragElementBehavior

Я хочу, чтобы это сделать:

<SomeUIElement> 
    <i:Interaction.Behaviors> 
     <ei:MouseDragElementBehavior ConstrainToParentBounds="True"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="DragFinished"> 
        <i:InvokeCommandAction Command="{Binding SomeCommand}"/> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </ei:MouseDragElementBehavior> 
    </i:Interaction.Behaviors> 
</SomeUIElement> 

Но, как обрисовывает другой вопрос, то EventTrigger не работает ... Я думаю, это потому, что он хочет найти DragFinished событие на SomeUIElement вместо на MouseDragElementBehavior. Это верно?

Так что я думаю, что я хочу сделать, это:

  • Написать поведение, которое наследуется от MouseDragElementBehavior
  • Override OnAttached метод
  • Подписаться на DragFinished события ... но я не могу выведите код, чтобы сделать этот бит.

Помогите пожалуйста! :)

ответ

1

Вот что я осуществил, чтобы решить вашу проблему:

public class MouseDragCustomBehavior : MouseDragElementBehavior 
{ 
    public static DependencyProperty CommandProperty = 
     DependencyProperty.Register("Command", typeof(ICommand), typeof(MouseDragCustomBehavior)); 

    public static DependencyProperty CommandParameterProperty = 
     DependencyProperty.Register("CommandParameter", typeof(object), typeof(MouseDragCustomBehavior)); 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 

     if (!DesignerProperties.GetIsInDesignMode(this)) 
     { 
      base.DragFinished += MouseDragCustomBehavior_DragFinished; 
     } 
    } 

    private void MouseDragCustomBehavior_DragFinished(object sender, MouseEventArgs e) 
    { 
     var command = this.Command; 
     var param = this.CommandParameter; 

     if (command != null && command.CanExecute(param)) 
     { 
      command.Execute(param); 
     } 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 
     base.DragFinished -= MouseDragCustomBehavior_DragFinished; 
    } 

    public ICommand Command 
    { 
     get { return (ICommand)GetValue(CommandProperty); } 
     set { SetValue(CommandProperty, value); } 
    } 

    public object CommandParameter 
    { 
     get { return GetValue(CommandParameterProperty); } 
     set { SetValue(CommandParameterProperty, value); } 
    } 
} 

И тогда XAML называть это так ....

 <Interactivity:Interaction.Behaviors> 
      <Controls:MouseDragCustomBehavior Command="{Binding DoCommand}" /> 
     </Interactivity:Interaction.Behaviors> 
Смежные вопросы