Контроллеры в MVVM, как получить информацию от viewmodel к нему контроллер?

Мы создаем приложение с использованием шаблона MVVM, у нас есть контроллеры, которые подключают все виды и режимы просмотра, используя DI. Все примеры MVVM, которые я видел, действительно упрощены и имеют 1 вид. Как делать/должны просматривать модели просмотра с контроллером? Контроллер знает о моделях и представлениях, должен ли viewmodel отправлять события обратно контроллеру? Где должно происходить спасение? Модель? Контроллер?

Ответ 1

Мы также используем контроллеры, но в нашем случае они несут ответственность за рабочий процесс приложения. Контроллер знает ViewModel и модель, но не конкретный вид, потому что это будет впрыскиваться контейнером IoC.

Если вас интересует пример, который показывает не только один интерфейс (модальный диалог, мастер с условным рабочим процессом), вы можете посмотреть:

WPF Application Framework (WAF) - http://waf.codeplex.com

Ответ 2

Может ли ваш ViewModel не зависеть от IController или какого-либо другого интерфейса, чтобы они могли поговорить с ним? Я стараюсь сохранить как можно больше логики приложения из ViewModel, так как эти классы могут легко раздуваться.

 MyViewModel(IController controller)
 {
     this.controller = controller;
 }

 void Save()
 {
     this.controller.Save();
 }

Я согласен с тем, что структуры MVVM, как правило, слишком упрощены с их образцами. В частности, перемещение между представлениями/экранами в вашем приложении - это то, что я хотел бы увидеть больше примеров. Я создаю интерфейс IViewManager, чтобы позволить моим ViewModels запрашивать, чтобы мы переместились в другое представление.

Ответ 3

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

http://msdn.microsoft.com/en-us/library/gg406140.aspx

Ответ 4

Я использую для вас подобную настройку. В моем контроллере, где моя инъекция DI и просмотр снижается, я иногда ссылаюсь на ViewModel (который удерживает View). В некоторых случаях у меня может быть событие на виртуальной машине, которое обрабатывается контроллером. В других экстремальных случаях (например, если VM/V был создан вне контроллера, скажем, в другой виртуальной машине), я могу даже использовать EventAggregator (с сильным ref) для прослушивания событий, которые могут быть запущены на виртуальной машине. В этом случае сохраненный ref для виртуальной машины не требуется.

Ответ 5

Как насчет использования событий, в которых контроллер подписывается на события виртуальной машины или использует шаблон посредника, где в медиаторе инъецируется в виртуальную машину.