Пропустите или получите значение от родительского просмотра вниз до подсек-модели?

StackOverflow https://stackoverflow.com/questions/2534619

Вопрос

Я использую фреймворк MVVM Light, а также Unity для DI. У меня есть несколько вложенных представлений, каждый из которых связан с соответствующей ViewModel. ViewModels связаны с DataContext DataContext Control каждого представления с помощью идеи ViewModellocator, которую Laurent Bugnion включил в свет MVVM. Это позволяет найти ViewModels через статический ресурс и контролировать срок службы ViewModels через структуру впрыска в зависимости, в данном случае Unity. Это также позволяет смеси выражения видеть все в отношении ViewModels и как их связывать.

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

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

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

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

  • Должен ли суб-визуалмодель запрашивать статический ресурс ViewModellocator для ссылки на тот же объект, который родительский представление использует и получает доступ к свойству? Кажется, что ViewModels, проходящие через свойства друг друга, не очень чистые и излишне объединяют их.

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

Это было полезно?

Решение 2

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

У меня был разговор в Твиттере с некоторыми известными именами в этом пространстве (Гленн Блок, Джон Папа и Роб Эйзенберг). Они предложили несколько вещей, таких как шаблон посетителей, но я не был уверен, что это будет работать так хорошо без иерархии виртуальных машин. Это может быть связано с тем, что мой дизайн был в значительной степени первым просмотром, в отличие от подхода, первым ViewModel. Другое предложение, которое, возможно, было бы работоспособным,-это изменить мое использование My ViewModellocator и впрыска зависимостей, чтобы включить возможность передавать значения данных в суб-VMS во время создания. У меня были небольшие проблемы с предвидеть это из -за статической природы VML, и я решил, что решение о запросе сообщения, которое я придумал, будет более простым и простым на данный момент. Скорее всего, мне придется переосмыслить решение, если в конечном итоге окажется слишком многое большим количеством данных, попавших в эту ситуацию.

Другие советы

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

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

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

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

Мой $ 0,02 Гленн

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top