У меня есть приложение, которому нужно открыть диалоговое окно с помощью кнопки, в которую пользователь вводит некоторую информацию.
На данный момент я делаю это так (что отлично работает)
- Нажатие кнопки генерирует команду в ViewModel.
- ViewModel вызывает событие, которое слушает контроллер.
- Контроллер обрабатывает детали нового окна (например, View, ViewModel и модель) и открывает его (ShowDialog).
- Когда окно закрывается, Контроллер добавляет результат к событиям и возвращается к ViewModel.
- ViewModel передает информацию модели.
Есть много шагов, но все они имеют смысл и не требуют большого набора текста.
Код выглядит так (окно запрашивает имя пользователя)
ViewModel:
AskUserNameCommand = DelegateCommand(AskUserNameExecute);
...
public event EventHandler<AskUserEventArgs> AskUserName;
void AskUserNameExecute(object arg) {
var e = new AskUserNameEventArgs();
AskUserName(this, e);
mModel.SetUserName(e.UserName);
}
Контроллер:
mViewModel.AskUserName += (sender,e) => {
var view = container.Resolve<IAskUserNameView>();
var model = container.Resolve<IAskUserNameModel>();
var viewmodel = container.Resolve<IAskUserNameViewModel>(view, model);
if (dlg.ShowDialog() ?? false)
e.UserName = model.UserName;
}
Мой вопрос в том, как горизонтальная коммуникация работает в шаблоне MVVM. Почему-то кажется неправильным позволять контроллеру участвовать в передаче данных между моделями.
Я рассмотрел шаблон посредника, чтобы модели могли общаться напрямую. Не нравится эта идея, поскольку она делает модель зависимой от деталей реализации графического интерфейса. (т.е. если диалоговое окно заменяется текстовым полем, модель необходимо изменить)