2010-02-14 90 views
2

我的應用程序層使用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

回答

2

您可以使用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