Создание tabcontrol в MVVM из центрального источника данных - PullRequest
2 голосов
/ 09 ноября 2010

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

Для простоты я разбираю проблему до ее самой простой формы.Если мне удастся заставить это работать, у меня будут небольшие проблемы с созданием приложения.

Простое приложение состоит из tabcontrol.Важно, чтобы обе вкладки имели собственную ViewModel.Тем не менее, они получат большую часть своих данных из того же источника.Основная проблема заключается в том, чтобы вторая вкладка знала, что первая инициировала изменение источника данных.

Итак, для простоты, давайте просто скажем, что модель содержит одно целое число.Это целое число первоначально должно быть установлено в 1.

Первая вкладка содержит текстовый блок и кнопку.Текст текстового блока привязан к целому числу в модели данных.После нажатия кнопки целое число в моделе должно быть увеличено на 1.

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

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

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

Ответы [ 3 ]

1 голос
/ 10 ноября 2010

Дайте мне посмотреть, правильно ли у меня ваш вопрос:

  • У вас есть источник данных (ваша модель).
  • У вас есть 2 модели просмотра.
  • Просмотр модели 1 изменяет данные в модели.
  • Просмотр модели 2 требует обновления с изменениями в модели.

Если все это звучит правильно, вот одно из решений:

Пусть ваша модель реализует INotifyPropertyChanged.Когда целое число изменится, вызовите событие PropertyChanged.В представлении модель 2 прослушивайте событие модели PropertyChanged.Когда это произойдет, вызовите событие изменения свойства модели представления 2, и его пользовательский интерфейс будет обновлен автоматически.

0 голосов
/ 10 ноября 2010

Я недавно реализовал нечто похожее на это.Это было для реализации мастера, состоящего из:

  • 7 Представлений
  • 8 Просмотр моделей
  • 1 Модель

Основная ViewModelсоздал модель и передал ее всем остальным моделям представления через их конструкторы.

В вашем сценарии вы можете иметь основную модель представления с ObservableCollection of ViewModels.У каждой из этих виртуальных машин будет тот же экземпляр модели, что и у их источника данных.

Как упоминалось ранее, реализуйте INotifyPropertyChanged на модели и привязывайте виды непосредственно к модели через свойство в ViewModel.Я нашел эту диаграмму очень полезной: http://karlshifflett.files.wordpress.com/2009/01/wpflobmvvm1.png

0 голосов
/ 09 ноября 2010

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

, например

public class ParentViewModel{

   private Tab1ViewModel viewModel1;
   private Tab2ViewModel viewModel2;
}

Затем ParentViewModel может подписаться на событие INotifyPropertyChanged в ViewModel1 и установить значение в ViewModel2.

...