2

我的应用程序层使用 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 做法吗?

谢谢

D

4

1 回答 1

2

您可以使用该ICommand接口的另一个实现,它将包装CancelCommandViewModel 的原始版本:

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;
于 2010-02-14T14:41:03.547 回答