MVVM多个命令处理程序

MVVM多个命令处理程序

问题描述:

我的应用程序层使用DialogPresenters在各种对话框(模式,闪屏等)中显示一些ViewModels。MVVM多个命令处理程序

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()); 
    } 

这种设置的作品真的很好,除了,如果我的视图模型决定它需要做的CancelCommand东西(这是完全合理的)事实,然后它将替换主持人的号召,终止()或反之亦然。

我想要做的是:

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

本着同样的精神作为附加的事件处理程序。

  1. 这在C#.NET 3.5中可能吗?
  2. 我将如何实现它?
  3. 这是不好的MVVM的做法?

感谢

d

您可以使用ICommand接口的另一个实现,这将包裹视图模型的原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; 
+0

这将在我当前使用情况的工作。我唯一担心的是,viewmodel可能会在不知不觉中覆盖命令。 – djskinner 2010-02-14 15:33:32

+0

我明白你的意思了......我通常在吸气剂中懒惰地初始化命令。如果你这样做,并且之后不再改变命令,它应该可以正常工作 – 2010-02-14 15:49:45