MVVM - связь между отдельными представлениями - PullRequest
7 голосов
/ 08 июня 2011

Я пытаюсь понять, как сделать следующее:

У меня есть CustomerListViewModel, который содержит ObservableCollection<Customer>

MainView содержит экземпляр этих представлений:

  • CustomerListView - который создает экземпляр CustomerListViewModel
  • SearchView - который создает и экземпляр SearchViewModel

У меня вопрос: как мне разделить CustomerListView и SearchView? SearchView должен отображаться только в том случае, если выбран клиент. Единственная зависимость для SearchViewModel должна быть Customer Model. Если в CustomerListViewModel не выбран Customer, то SearchView не должен отображаться.

Должен ли я ввести новый View / ViewModel, который содержит CustomerListViewModel и SearchViewModel, который может содержать ссылку на выбранный Customer и переключать отображение SearchView? Если нет, то как мне это сделать?

Я знаю, что этот вопрос довольно широкий, но я был бы признателен за любые предложения.

Ответы [ 4 ]

4 голосов
/ 08 июня 2011

Не заставляйте MainView содержать экземпляры CustomerListView и SearchView. Все три из них должны быть отдельными.

Что касается связи между представлениями, это должно быть сделано через соответствующую модель представления с использованием, например, mvvm-light messenger. Если вы регистрируете разных мессенджеров в каждом представлении, то из модели представления вы можете отправить сообщение любому желаемому представлению.

Просто пример простоты использования MVVMLight Messenger: -

Вид:

Messenger.Default.Register<NotificationMessage>(this, OpenViewMessageReceived);

private void OpenViewMessageReceived(NotificationMessage msg)
{
    //Logic 
}

ViewModel:

Messenger.Default.Send(new NotificationMessage(someStr));
1 голос
/ 27 июля 2013

Вот хорошая статья о связи между представлениями в MVVM: Связь между представлениями в MVVM (шаблон Pub-Sub)

1 голос
/ 08 июня 2011

Я недавно написал кое-что, что касалось этого здесь . Возможно, вам будет интересно проверить это.

По сути, если вы можете получить доступ к своему значению из привязки RelativeSource, это, вероятно, самый простой способ сделать это

Что-то вроде {Binding RelativeSource={RelativeSource AncestorType={x:Type local:MainView}}, Path=DataContext.CustomerListViewModel.SelectedCustomer}

Или внедрите систему обмена сообщениями, которая передает сообщение всякий раз, когда SelectedCustomer изменяется. У MVVM Light Toolkit есть хороший простой, использующий класс Messenger, или у Prism более продвинутый EventAggregator.

0 голосов
/ 08 июня 2011

Если это не «перебор» для вас, вы можете оформить заказ ПРИЗМА

Это руководство с библиотекой для составных приложений, использующих MVVM и MEF. Это очень аккуратная библиотека, но для небольших проектов она может быть больше.

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