Связь между 6 ViewModels и Messenger == AntiPattern? - PullRequest
1 голос
/ 14 октября 2010

Общий подход к обмену данными между двумя ViewModels заключается в следующем: MVVM - просмотр связи модели с представлением модели

Шаблон Mediator или класс Messenger. Но как насчет 6 ViewModels в одном окне?

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

Все это в одном окне. Действительно ли "вы" говорите мне сейчас, что я должен настроить Messenger для этих 6 видов и их Viewodels? Это было бы ужасно ...

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

Мне было бы интересно мнение кого-то, имеющего опыт работы с большими mvvm-приложениями:)

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

ОБНОВЛЕНИЕ : для слепого мейса; -)

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 фактически преобразована в DataGrid. Периоды - это строки. В каждой строке есть столбец с названием «Документы». У меня есть PeriodListViewModel 1: N DocumentListViewModel.

DocumentListViewModel помечается датой с помощью UserControl, содержащего ListBox и под некоторыми кнопками add / del / save / open и т. Д. *

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

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

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

1 Ответ

1 голос
/ 14 октября 2010

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

если ваши viewmodels ссылаются друг на друга, вам не нужен мессенджер, но он не более беспорядочно связан:)

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

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

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

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

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

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

...