我的应用程序层使用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());
与附加事件处理程序的精神相同。
由于
d
答案 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;