MVVM多命令处理程序

时间:2010-02-14 12:39:26

标签: wpf mvvm commandbinding

我的应用程序层使用DialogPresenters在各种对话框中显示一些ViewModel(模态,启动画面等)。

    public DataImportDialogPresenter(DataImportViewModel viewModel, IDialogView shellView, IDialogView owner)
        : base(viewModel, shellView, owner)
    {
        //Base sets the view data context etc.
        //Monitor CancelCommand and close the dialog
        viewModel.CancelCommand = new DelegateCommand(() => Terminate());
    }

这个设置工作得非常好,除非我的ViewModel决定它需要在CancelCommand上做一些事情(这是完全合理的)然后它将取代演示者对Terminate()的调用,反之亦然。

我想做的是:

viewModel.CancelCommand += new DelegateCommand(() => Terminate());

与附加事件处理程序的精神相同。

  1. 这是否可以在C#.NET 3.5中使用?
  2. 我如何实现它?
  3. 这是一个糟糕的MVVM练习吗?
  4. 由于

    d

1 个答案:

答案 0 :(得分:2)

您可以使用ICommand接口的另一个实现,它将包装ViewModel的原始CancelCommand

public class WrapperDelegateCommand : ICommand
{
    private Action<object> _action;
    private ICommand _originalCommand;

    public WrapperDelegateCommand(Action<object> action, ICommand original)
    {
        _action = action;
        _originalCommand = original;
    }

    public bool CanExecute(object param)
    {
        if (originalCommand != null)
            return _originalCommand.CanExecute(param);
        return true;
    }

    public void Execute(object param)
    {
        if (_originalCommand != null)
            _originalCommand.Execute(param);
        _action(param);
    }

    public ICommand OriginalCommand { get { return _originalCommand; } }
}

然后,您可以将此命令分配给ViewModel的命令:

viewModel.CancelCommand = new WrapperDelegateCommand(() => Terminate(), viewModel.CancelCommand);

您应该使用Terminate方法恢复原始命令:

viewModel.CancelCommand = (viewModel.CancelCommand as WrapperDelegateCommand).OriginalCommand;