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());
本着同样的精神作为附加的事件处理程序。
- 这在C#.NET 3.5中可能吗?
- 我将如何实现它?
- 这是不好的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;
这将在我当前使用情况的工作。我唯一担心的是,viewmodel可能会在不知不觉中覆盖命令。 – djskinner 2010-02-14 15:33:32
我明白你的意思了......我通常在吸气剂中懒惰地初始化命令。如果你这样做,并且之后不再改变命令,它应该可以正常工作 – 2010-02-14 15:49:45