ViewModel для ViewModel Связь - PullRequest
       25

ViewModel для ViewModel Связь

4 голосов
/ 26 января 2011

Учитывая следующий сценарий:

  1. ViewModelA запускает ViewModelB (конечно, через общий контроллер, который использует Ioc и DI для разрешения необходимых типов).
  2. ViewModelB необходимоустановить значение свойства в ViewModelA.

Разве это плохо, просто внедрить ViewModelA в ViewModelB с помощью инжектора конструктора и просто установить свойство напрямую?

Или…

Следуетсистема сообщений, такая как EventAggregator от Prism, будет использоваться для обработки всего взаимодействия между ViewModels?

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

Ответы [ 4 ]

2 голосов
/ 26 января 2011

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

Пусть ViewModelB вызовет событие, на которое ViewModelA подписывается.Полноценная система обмена сообщениями, подобная той, что есть в Prism, безусловно, является вариантом, но в вашем сценарии она звучит так, как будто «нормальное» событие подойдет просто.

1 голос
/ 26 января 2011

Я предлагаю вам прочитать этот вопрос (и мой ответ) , поскольку он похож, но не совсем ваша проблема.Он имеет дело со связью свойств между родительскими / дочерними объектами ViewModel.

Давайте рассмотрим базовый пример:

  • ViewModelA является родителем и должен представить сумму некоторыхсвойство в B
  • ViewModelB является дочерним и имеет свойство, которое требует суммирования

Таким образом, пользователь делает запрос на редактирование свойства в B, и запрос выполняется, поэтому Bпредположительно изменяет значение своего свойства и запускает событие PropertyChanged.

ViewModelA может подписаться на события всех детей, но, пройдя этот путь, мне это не нравится.Когда дети добавляются и удаляются, у вас есть много дел для ведения бухгалтерского учета.

Инъекция А в В более чистая, но вам все равно придется много делать.Что если у вас есть действие «Чистые дети» на А?Вы должны помнить, чтобы правильно избавиться от родительских отношений от B до A во всех случаях.Тем не менее, на мой взгляд, это лучше, чем события, потому что это более явно.

Лично мне нравится идея обмена сообщениями.Я больше знаком с посланником MVVM Light, чем с Prism, но это та же идея ... глобальная шина сообщений.В любое время любой B может сказать: «Я изменил свою собственность!»а затем A прослушивает уведомление и выполняет само вычисление.Я думаю, что это ваше самое чистое решение с гораздо меньшим количеством бухгалтерии.

0 голосов
/ 26 марта 2017

Я предлагаю использовать более легкое выделенное решение Messaging под названием " Light Message Bus ".Это не часть какого-то другого ;-) MVVM-фреймворка, но независимый компонент.И я получил его за мгновение менее чем за 3 минуты.

0 голосов
/ 29 января 2011

Вы можете найти примеры приложений WPF Application Framework (WAF) .ViewModels не знают друг о друге.Посредничество между ними осуществляется контроллерами .Таким образом, вы можете предотвратить циклические зависимости между объектами ViewModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...