MVVM Многократные Командные Обработчики - PullRequest
2 голосов
/ 14 февраля 2010

Слой My Application использует 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());

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

  1. Возможно ли это в C # .NET 3.5?
  2. Как бы я этого достиг?
  3. Это плохая практика MVVM?

Спасибо

D * * тысяча двадцать-один

1 Ответ

2 голосов
/ 14 февраля 2010

Вы можете использовать другую реализацию интерфейса 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;
...