2010-10-13 2 views
1

Общий подход для связи между 2 ViewModels заключается в следующем: MVVM- View Model-View Model CommunicationsСвязь между 6 ViewModels и Messenger == AntiPattern?

Модель посредника или класс Messenger. Но как насчет 6 ViewModels в одном окне?

  1. NewSchoolclassUserControl
  2. NewPupilUserControl
  3. SchoolclassListUserControl
  4. PupilListUserControl
  5. PupilsDetailUserControl
  6. AdministrationButtonBarUserControl (имеющие кнопки выполнения команд)

Все это в ОДНОМ окне. «Ты» действительно скажи мне сейчас, мне нужно настроить Messenger для этих 6 просмотров и их просмотра? Это было бы ужасно ...

6 UserControls в одном окне, даже большое корпоративное приложение не имеет большего количества UserControls в окне, так что же приемлемая/лучшая практика в этом случае?

я был бы заинтересован в чьем-то мнении, имеющий опыт работы с большими MVVM приложениями :)

Некоторые из этих UserControl + ViewModels Я хотел бы повторно использовать в других местах моего приложения. Так что положить все в один UserControl - это не то, чего я действительно хочу.

UPDATE: для слепых Meise ;-)

private DateTime _selectedDate; 
     public DateTime SelectedDate 
     { 
      get { return _selectedDate; } 
      set 
      { 
       if (_selectedDate == value) 
        return; 

       _selectedDate = value; 
       this.RaisePropertyChanged("SelectedDate"); 


       ObservableCollection<Period> periods = _lessonplannerRepo.GetLessonDayByDate(SelectedDate); 

       _periodListViewModel = new ObservableCollection<PeriodViewModel>(); 

       foreach (Period period in periods) 
       { 
        PeriodViewModel periodViewModel = new PeriodViewModel(period); 

        foreach (DocumentListViewModel documentListViewModel in periodViewModel.DocumentViewModelList) 
        { 
         documentListViewModel.DeleteDocumentDelegate += new Action<List<Document>>(OnDeleteDocument); 
         documentListViewModel.AddDocumentDelegate += new Action(OnAddDocument); 
         documentListViewModel.OpenDocumentDelegate += new Action<Document>(OnOpenDocument); 
        } 

        _periodListViewModel.Add(periodViewModel);      

       } 
      } 
     } 

@blindmeise

Это ViewModel является datatemplated фактически к DataGrid. Периоды - это строки. Каждая строка имеет столбец под названием «Документы». У меня есть PeriodListViewModel 1: N DocumentListViewModel.

DocumentListViewModel является datatemplated с UserControl, содержащей ListBox и ниже некоторые кнопки добавить/дела/сохранить/открыть и т.д ...

DocumentListViewModel имеет команды и действия делегатов, выполненные в «LessonController» так каждое действие на документ, подобный add, del и т. д., может быть выполнен на элементе SelectedPeriodViewModel, объявленном в LessonController.

Приведенный выше код просто загружает новые данные из базы данных, когда пользователь меняет дату в datepicker.

Вам нужно больше кода или что вы скажете о моем подходе? Я очень хочу учиться, и я рад каждому критику!

+0

Нет ничего плохого в отношении 6 или 60 элементов управления пользователя в одном окне. Существуют только удобные и непригодные для использования пользовательские интерфейсы. –

ответ

1

Если у вас есть 6 или 1000 слабосвязанных режимов просмотра, которые должны взаимодействовать друг с другом, тогда вы должны использовать мессенджер/посредник. он вообще не имеет никакого отношения к пользовательскому контролю.

если ваш ViewModels ссылки друг к другу, то у вас нет необходимости посланника, но его больше не loosly не связан тогда :)

редактировать: его очень трудно сказать, что может вам лучше, потому что я не знайте, чего вы хотите достичь с помощью своего приложения и вашего приложения. В общем, это зависит от того, как вы определяете задачи для своих моделей просмотра и как вы хотите соединить эти модели представлений. возможно, вам следует проверить некоторые примеры проектов со всего www :) существует много реализаций mvvm, которые сильно различаются, но дают лучшее понимание на шаблоне mvvm (шаблон !! не правило !!;))

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

public DateTime SelectedDate 
{ 
    get { return _selectedDate; } 
    set 
    { 
     if (_selectedDate == value) 
      return; 

      _selectedDate = value; 
      this.RaisePropertyChanged("SelectedDate"); 

      this.messenger.Notify("SelectedDateChanged", this.SelectedDate) 
    } 
} 

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

+0

хорошо, мои режимы просмотра относятся к другим режимам просмотра, потому что если вы выберете школьный класс в schoolclassListViewModel, список учеников в PupilListViewModel должен измениться. Агрегация ViewModels - это не выход. Я слышал ... – Elisabeth

+0

Если у вас есть ссылки с viewmodel на viewmodel, вам не нужен медиатор, вы можете использовать события, например. возможно, вы можете опубликовать код (vm + view). Какой подход mvvm вы идете? сначала просмотреть или просмотреть модель? – blindmeis

+0

Я делаю atm Просмотр первого подхода, но, вероятно, я переключусь на ViewModel сначала из-за MEFedMVVM и сервисов и т. Д. ... вернуться к теме: – Elisabeth

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