2010-02-14 4 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()); 
    } 

Эта установка работает очень хорошо для того, что если мой ViewModel решает, что нужно сделать что-то на CancelCommand (что вполне разумно), за исключением, то он заменит призыв докладчика на Terminate() или наоборот ,

То, что я хотел бы сделать, это:

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

В том же духе, как прикрепление обработчиков событий.

  1. Возможно ли это в C# .NET 3.5?
  2. Как я могу это достичь?
  3. Является ли это плохой практикой MVVM?

Благодаря

D

ответ

2

Вы могли бы использовать другую реализацию интерфейса ICommand, что бы укрыть оригинальную CancelCommand из ViewModel:

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

+0

Я вижу вашу точку ... Обычно я инициализирую команду лениво в геттере. Если вы это сделаете и никогда не меняете команду, она должна работать нормально –

Смежные вопросы