命令行为附件参数

时间:2012-05-28 13:41:45

标签: wpf mvvm command-behaviors

我已经在本文中实现了代码:http://wblo.gs/YvF。一切都按预期工作,但我不知道如何在事件触发时访问传递给事件处理程序的Arguments。我知道有命令参数,但我如何使用它来访问EventArgs?这是我实施的代码......

DragEnter Class

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

public class DragEnter : Attachment<Control, DragEnterBehavior, DragEnter>
{
    private static readonly DependencyProperty behaviorProperty = Behavior();
    public static readonly DependencyProperty CommandProperty = Command(behaviorProperty);
    public static readonly DependencyProperty CommandParameterProperty = Parameter(behaviorProperty);

    public static void SetCommand(Control control, ICommand command) { control.SetValue(CommandProperty, command); }
    public static ICommand GetCommand(Control control) { return control.GetValue(CommandProperty) as ICommand; }
    public static void SetCommandParameter(Control control, object parameter) { control.SetValue(CommandParameterProperty, parameter); }
    public static object GetCommandParameter(Control buttonBase) { return buttonBase.GetValue(CommandParameterProperty); }
}

DragEnterBehavior类

using System.Windows.Controls;
using Microsoft.Practices.Prism.Commands;

public class DragEnterBehavior : CommandBehaviorBase<Control>
{
    public DragEnterBehavior(Control selectableObject)
        : base(selectableObject)
    {
        selectableObject.DragEnter += (sender, args) => ExecuteCommand();
    }
}

实施守则

public ICommand EditItemCommand
{
    get
    {
        if (editItemCommand == null)
            editItemCommand = new RelayCommand(param => EditItemControl(), pre => IsItemEditButtonEnabled());

        return editItemCommand;
    }
}

public void EditItemControl()
{
    ...
    ChangedView(itemEditorViewModel);
}

<ListBox Behaviors:DragEnter.Command="{Binding EditItemCommand}" ...

对此有任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:1)

这是未经测试的,但

  • 将DragEnterBehaviour更改为

    public class DragEnterBehavior : CommandBehaviorBase<Control>
    {
        public DragEnterBehavior(Control selectableObject)
            : base(selectableObject)
        {
            selectableObject.DragEnter += (sender, args) =>
                                          {
                                              CommandParameter = args;
                                              ExecuteCommand();
                                          };
        }
    } 
    
  • 将您的RelayCommand(我假设这是来自MVVM Light)更改为

    public ICommand EditItemCommand 
    { 
        get 
        { 
            if (editItemCommand == null) 
                editItemCommand = new RelayCommand<DragEventArgs>(
                    EditItemControl, IsItemEditButtonEnabled); 
    
            return editItemCommand; 
        } 
    } 
    
    public void EditItemControl(DragEventArgs args) 
    { 
        ... 
    } 
    

如果您正在使用MVVM Light,那么您将获得相同的结果:

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="DragEnter"> 
        <cmd:EventToCommand Command="{Binding DragEnterCommand}" 
            PassEventArgsToCommand="True" /> 
    </i:EventTrigger> 
</i:Interaction.Triggers>