2012-04-25 3 views
0

Я пишу приложение WPF в C# в соответствии с моделью MVVM. У меня есть MainWindow, который состоит из нескольких видов: MenuView, ContentView1, ContentView2,. , , и так далее.Передача данных между различными видами

Меню, ContentView1, ContentView2. , ., все кузены (не беспокоит) в дереве XAML.

Меню MenuView состоит из нескольких кнопок. Каждая кнопка имеет уникальный идентификатор. Представления содержимого (все они) должны получить идентификатор меню выбранной (нажатой) кнопки. т. Е. Когда нажата кнопка в MenuView, я хочу передать ее идентификатор в ContentViews1, ContentsViews2 и т. Д.

Я не уверен, что является лучшим способом передачи данных между видами.

Я думал приложить обработчик событий ко всем кнопкам меню, которые находятся в MenuView. Обработчик реализован в классе MainWindow (который является корневым представлением). Этот обработчик поднимет RoutedEvent (с возможностью туннелирования) для всех видов детей.

Есть ли лучший способ сделать это? Это лучший способ рассмотрения проблемы с производительностью?

+1

Если вы не передаете данные между * ViewModels *, вам не хватает точки MVVM. – Jon

ответ

0

Этот подход напоминает мне немного о моем давно прошедшем java-опыте, в котором вы передаете какую-то боевую строку !? слушателю.

Вы привязываете все кнопки к одному обработчику? И в зависимости от Id, вы хотите выполнять действия внутри подзонов?

Если да, вы должны привязать все кнопки к своей собственной ICommand и выполнить действия внутри делегата обработчика.

+0

да, это именно то, что я хочу сделать. Если я привяжу все кнопки к своей ICommand, что произойдет, если в будущем появится другое представление, которое необходимо обновить? означает ли это, что мне нужно обновить метод Excecute? –

+0

Как говорит Джон, вы можете зарегистрировать все режимы просмотра на событии. В ICommand вы просто поднимаете разные события (xxxPressedEvent, NewUserEvent и т. Д. И т. Д.). Если появится новый вид (модель), этот объект просто должен зарегистрироваться на правильных событиях. Это может быть в MenuViewModel, где расположены все события и все методы Execute. – csteinmueller

0

Вы могли бы просто иметь MenuViewModel разоблачить событие, на которое будут подписаны другие (заинтересованные) ViewModels. Каждый вид может затем привязываться к соответствующему событию и делать то, что ему нужно.

Это оставляет открытым вопрос о том, как каждый заинтересованный ViewModel обнаружит наличие MenuViewModel, чтобы он мог подписаться на его события, но на этот вопрос нельзя ответить без каких-либо знаний о вашем приложении и вашей выборке MVVM.

+0

Я иногда использую шаблон MVVMC (C для контроллера). Контроллер (как говорит название) контролирует взаимодействие между ViewModels. Возможно, он дает каждому ViewModel экземпляр MenuViewModel. Следующим шагом будет использование Unity для регистрации ViewModels с помощью eventaggregator или использования локатора ViewModel (см. MVVMLight). – csteinmueller

Смежные вопросы