MVVM передает значения между моделями представления - PullRequest
5 голосов
/ 18 июня 2011

Я пытаюсь решить проблему передачи значения из одной ViewModel в другую. Вот пример.

У нас есть Parent View и соответствующий ViewModel, в этом View мы выбираем элемент, а затем мы хотим создать новый Child View (для редактирования деталей выбора), который создает его ViewModel в XAML. Проблема возникает, когда мне нужно передать значение в конструктор Child ViewModel (это идентификатор данных, которые должны быть получены из базы данных). Я предполагаю, что ViewModel Parent должен взаимодействовать с ViewModel Child - но это невозможно сделать, поскольку ViewModel Child не создается до тех пор, пока Child не сделает это в XAML, поэтому мы не можем использовать Messenger (MVVM Light Toolkit) и просто распространять эту информацию из ModelView Родителя, потому что Child. ModelView не удалось подписаться (зарегистрироваться для сообщений такого типа).

Я не хочу нарушать паттерн MVVM и не могу найти хорошего решения для этого. Я благодарен за любую помощь, которую я могу получить.

Ответы [ 2 ]

6 голосов
/ 18 июня 2011

Один из основных владельцев шаблона MVVM заключается в том, что вы должны иметь возможность выполнять свой код ViewModel без View, чтобы выполнить модульное тестирование вашей логики View.Другими словами, в идеале вы должны иметь возможность выполнять ваше приложение в режиме «без головы».

В вашем примере вы утверждаете, что ParentView создает ChildView, который, в свою очередь, создает ChildViewModel (к которому вы пытаетесь подключиться.вверх).Может ли это работать в режиме без головы?Мне кажется, что вы полагаетесь на свой View для выполнения этой навигации Parent-Child.

Если вы перевернете его другим способом, у ParentViewModel создайте ChildViewModel, у вас больше не будет проблем со связью между ViewModels.ParentView необходимо «наблюдать» (т. Е. Изменять свойства) для нового создаваемого ChildViewModel и соответствующим образом создавать ChildView.

Более подробно:

  1. ParentView создает экземпляр ParentVM
  2. Пользователь взаимодействует таким образом, что требуется дочерний элемент
  3. ParentVM создает ChildVM, экспонируя его через свойство ChildVM
  4. ParentView обрабатывает результирующее событие PropertyChanged, создавая ChildView, устанавливая егоDataContext to ChildVM.
0 голосов
/ 18 июня 2011

Что, если какой-либо фреймворк вы используете? Под этим я подразумеваю MvvmLight, Caliburn Micro или Prism. Каждая структура имеет инфраструктуру обмена сообщениями. Вы можете использовать их для передачи состояния назад и вперед, используя методику публикации / подписки. Например, взгляните на призму. Есть несколько быстрых стартов, которые показывают модель событий. Вы также можете поддерживать контроллер представления для организации связи между представлениями.

Взгляните на пример приложения Ward Bell's Prism Explorer. Это статья от '09, однако она актуальна и сегодня. Особенно посмотри, как он передает объект-сущность из списка в детальный детальный вид.

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