Связь между 6 ViewModels и Messenger == AntiPattern?
Общий подход для связи между двумя ViewModels заключается в следующем: MVVM - связь между моделью и представлением модели.
Шаблон Mediator или класс Messenger. Но как насчет 6 ViewModels в одном окне?
- NewSchoolclassUserControl
- NewPupilUserControl
- SchoolclassListUserControl
- PupilListUserControl
- PupilsDetailUserControl
- 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 ответ
Если у вас есть 6 или 1000 моделей со слабой связью, которые должны взаимодействовать друг с другом, вам следует использовать мессенджер / посредник. это не имеет никакого отношения к пользовательскому контролю вообще.
если ваши viewmodels ссылаются друг на друга, то вам не нужен мессенджер, но он не более беспорядочно связан:)
редактировать: действительно трудно сказать, что вы можете улучшить, потому что я не знаю, чего вы хотите достичь с помощью вашего приложения и вашего дизайна приложения:) в общем, это зависит от того, как вы определяете задачи для своих моделей представления и как вы хотите пара этих моделей. может быть, вам следует проверить несколько примеров проектов через WWW:) Существует множество реализаций mvvm, которые сильно различаются, но дают лучшее понимание шаблона mvvm (шаблон!! не правило!!;))
Представьте, что у вас есть модель представления, которая ничего не делает, затем выбирает дату. это был бы простой слабо связанный vm. все, что вы можете сделать сейчас, когда выбрана новая дата, отправить сообщение через мессенджер.
public DateTime SelectedDate
{
get { return _selectedDate; }
set
{
if (_selectedDate == value)
return;
_selectedDate = value;
this.RaisePropertyChanged("SelectedDate");
this.messenger.Notify("SelectedDateChanged", this.SelectedDate)
}
}
теперь все другие слабо связанные модели представления могут регистрироваться в посреднике и сообщении "SelectedDateChanged" и делать то, что хотят сделать, когда дата изменилась. Возможно, это не вписывается в ваш дизайн, но должно дать вам представление о шаблоне мессенджера.