Передать или получить значение из родительского ViewModel до Sub-ViewModel? - PullRequest
1 голос
/ 29 марта 2010

Я использую инфраструктуру MVVM Light, а также Unity для DI. У меня есть несколько вложенных видов, каждый из которых связан с соответствующей ViewModel. ViewModels связаны с каждым корневым элементом управления DataContext через идею ViewModelLocator, которую Лоран Буньон добавил в MVVM Light. Это позволяет находить ViewModels через статический ресурс и управлять временем жизни ViewModels через платформу Dependency Injection, в данном случае Unity. Это также позволяет Expression Blend видеть все, что касается ViewModels и как их связать.

Как я уже говорил, представления имеют здоровую дозу вложенности, но ViewModels действительно ничего не знают друг о друге. Родительское представление привязывается к соответствующему ViewModel через статический ресурс ViewModelLocator (который использует Unity для управления созданием и временем жизни объекта ViewModel). Это родительское представление содержит в себе пользовательский элемент управления, который является другим вложенным представлением, которое затем отправляет и получает соответствующий ViewModel через ViewModelLocator. Модели представления не имеют ссылок друг на друга или не знают какой-либо иерархии по отношению друг к другу.

Итак, вот пример того, как ViewModels взаимодействуют посредством обмена сообщениями. У меня есть родительский View, который имеет привязку ComboBox к ObservableCollection в его ViewModel. SelectedItem ComboBox также привязан (двусторонний) к свойству в ViewModel. Когда выбор ComboBox изменяется, это вызывает обновления в других представлениях и вложенных представлениях. В настоящее время я выполняю это через систему сообщений, которая находится в MVVM Light.

Итак, мне интересно, как лучше всего передавать информацию из одной модели представления в другую? В этом случае мне нужно передать подчиненным моделям в основном пользовательский Guid, представляющий текущего пользователя, вошедшего в систему. Самый верхний родительский View (ну, ViewModel) будет знать эту информацию, но я не уверен, как передать ее в под-ViewModels.

Некоторые возможные подходы, которые я могу придумать:

  • Если подчиненная модель представления спросит статический ресурс ViewModelLocator для ссылка на тот же объект родительский вид использует и доступ к собственность таким образом? Это похоже на ViewModels, проходящие через друг друга свойства не очень чистые и связывает их вместе без необходимости.

  • Я уже использую сообщения для уведомления Подвиды, выбранные пользователем новый элемент в ComboBox и обновлять соответственно. Но объект тип, который выбирается в ComboBox не совсем напрямую связанные с этим значением данных, что Подвиды необходимо.

Ответы [ 2 ]

3 голосов
/ 31 марта 2010

Я видел в основном два подхода к этому. Для общего взаимодействия между виртуальными машинами шаблон агрегатора событий прекрасно работает.

Однако для иерархий виртуальных машин лучше использовать шаблон Visitor. С посетителем вы можете получить информацию, которая течет по иерархии, например, давая каждому ребенку ссылку на родительскую виртуальную машину автоматически.

Вы также можете сделать это с EA, но проблема заключается в передаче достаточного количества информации в полезную нагрузку сообщения, чтобы дети знали, что это то, о чем они должны заботиться.

Что касается VM locator, то абсолютно нет! Материал локатора VM строго для привязки в пользовательском интерфейсе, он не должен выходить за пределы этого контекста (оптимально).

Мои $ .02 Гленн

0 голосов
/ 02 апреля 2010

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

У меня был разговор в Твиттере с некоторыми известными именами в этом пространстве (Гленн Блок, Джон Папа и Роб Айзенберг). Они предложили несколько вещей, таких как Шаблон посетителя, но я не был уверен, что это будет работать так хорошо без иерархии виртуальных машин. Это может быть из-за того, что мой дизайн был в значительной степени View-first, а не ViewModel-first. Другим предложением, которое могло бы быть работоспособным, было бы изменить мое использование ViewModelLocator и Dependency Injection, чтобы включить возможность передачи значений данных суб-VM во время создания. У меня были небольшие проблемы с представлением этого из-за статического характера VML, и я решил, что решение для запроса сообщений, которое я придумал, будет на данный момент более простым и простым. Скорее всего, мне придется переосмыслить решение, если в этой ситуации окажется слишком много фрагментов данных.

...