PRISM / MEF: Как модели окна 2-х окон могут общаться друг с другом? - PullRequest
3 голосов
/ 30 марта 2011

В принципе, я не уверен, с чего начать:

У меня есть окно Shell.xaml. У меня также есть окно Popup.xaml.

Я установил Shell.xaml для импорта PopupWindow, а затем при возникновении события PopupWindow Loaded:

Popup.Owner = this;
Popup.Show();

Теперь мне нужно, чтобы ViewModel PopupWindow связывался с Shell.xaml. По сути, мне нужно, чтобы PopupWindow сообщало информацию ViewModel оболочки о вводимых пользователем данных.


Обновление:

Сохраняя эту развязку, я не хочу передавать ни одного экземпляра модели представления Клиента во всплывающее окно, я бы предпочел, чтобы ViewModel всплывающего окна каким-то образом имел способ связаться с ViewModel Клиента, не зная, кто это. на самом деле разговаривает.

Ответы [ 2 ]

7 голосов
/ 31 марта 2011

Посмотрите на агрегатор событий в Prism.Агрегированные события в Prism предназначены для облегчения разобщенного взаимодействия между моделями.Если вы собираетесь использовать «чистый» MVVM, я думаю , что он будет выглядеть примерно так:

  • Ваша ViewModel публикует сообщение (запрос на взаимодействие), которое хочет отобразитьpopup.
  • Ваш View прослушивает сообщение и отображает всплывающее окно (отделяет вашу модель представления от понимания того, как отображаются подсказки)
  • Ваша ViewModel получает результаты всплывающего окна (ваше всплывающее окноокно - это просто представление и ничего не должно знать о генерации агрегатных событий)
  • Ваша ViewModel вызывает агрегированное событие Prism (объект, содержащий вводимые пользователем данные, является полезной нагрузкой)
  • Ваша оболочка прослушиваетэто событие.
1 голос
/ 30 марта 2011

Я не гуру PRISM / MEF, но, если бы я атаковал эту проблему, я бы использовал немного другой подход и добавил бы немного больше развязки. По сути, вы хотите, чтобы ViewModels ваших окон (Shell и Popup) взаимодействовали - окна ( Views ) должны взаимодействовать только с пользователем и обновлять свойства (в развязанном, привязанном к модели стиле). ) на их ViewModels .

Как только вы окажетесь в этом положении, ViewModel Shell может запросить информацию о пользователе (скажем, из свойства) Popup ViewModel . Хотя, конечно, они не являются ViewModels ни Shell, ни Popup - они являются просто ViewModels , с которыми эти виды связаны:)

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

Dan

Редактировать

После комментария Михаила:

Как я уже сказал, я не эксперт в PRISM, но я думаю, что это зависит от того, насколько далеко вы хотите пойти с разделением. Ничто не мешает клиентской ViewModel создавать и показывать всплывающее окно, а затем запрашивать у ViewModel всплывающего окна данные перед их удалением. Это не чистый MVVM, потому что ваш клиент ViewModel осуществляет довольно прямую связь с Popup и его ViewModel, но он будет работать, и это не такой большой грех.

Я бы пошел с прагматическим подходом в таких случаях, когда, в любом случае, существует естественная зависимость. У вас все еще есть разделение View и ViewModel.

Я полагаю, что здесь есть люди, которые могут обучить более разобщенному подходу, о котором мне также было бы интересно прочитать.

...