Составление представлений WPF и моделей представлений MVVM - PullRequest
2 голосов
/ 11 января 2012

У меня есть пользовательский интерфейс с вложенными пользовательскими элементами управления WPF, каждый со своими моделями представления.Простой случай иерархии представлений (XAML):

MainWindow
    |-> Logical group
      |-> Logical control
    |-> Second logical group
    |-> Third logical group
      |-> Logical control

Каждое представление XAML имеет ViewModel, который инкапсулирует логику взаимодействия.Мои вопросы касаются передачи состояния ViewModel из модели родительского представления в модели дочернего представления.

Например, взаимодействие с пользователем в MainWindow может установить переменную CurrentlySelectedGroup в MainWindowViewModel.Мне нужно знать, что это значение внутри LogicalControlViewModel.

. Есть два основных способа сделать это.Сначала я мог передать событие DispatchGroupSelected, а затем назначить делегата внутри LogicalControlViewModel в качестве прослушивателя этого события.Во-вторых, я мог бы Bind в CurrentlySelectedGroup свойство MainWindowViewModel внутри LogicalControlViewModel.

Мой первый инстинкт - использовать события для связи между родительскими и дочерними моделями представления.Я думаю, что связывание лучше всего хранить между моделью представления и ее видом.События до сих пор использовались для связи между моей ViewModel и командами.Если есть другое возможное направление, которое было бы лучше, мне было бы интересно узнать об этом.

1 Ответ

1 голос
/ 11 января 2012

Вы пробовали с шиной сообщений ??Есть несколько структур, которые реализуют этот шаблон:

  • PRISM, есть EventAggregator, где вы можете определить контракт, а затем отправлять и получать уведомления после него.
  • MVVM Light, такжеу вас есть MessageBus, о котором вы можете узнать здесь .
  • RectiveUI, это мой любимый инструмент, он сочетает в себе мощность Reactive Extensions Observable с шаблоном Message Bus, некоторую документацию можно найти здесь .

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

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