【发布时间】:2010-10-13 21:27:08
【问题描述】:
在 2 个 ViewModel 之间进行通信的常用方法是:MVVM- View Model-View Model Communications
中介者模式或信使类。但是一个 Window 中有 6 个 ViewModel 呢?
- NewSchoolclassUserControl
- NewPupilUserControl
- SchoolclassListUserControl
- PupilListUserControl
- PupilsDetailUserControl
- 管理按钮栏用户控件 (有按钮执行命令)
所有这些都在一个窗口中。 “你”现在真的告诉我我必须为这 6 个视图及其 Viewodels 设置一个 Messenger 吗?那太可怕了……
6 个用户控件在一个窗口中,即使是大型企业应用程序在一个窗口中也没有更多用户控件,那么在这种情况下,什么是公认的/最佳实践?
我会对有大型 mvvm 应用程序经验的人的意见感兴趣:)
其中一些 UserControl+ViewModel 我想在我的应用程序的其他地方重用。所以把所有的 UserControl 都放在一个 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 的数据模板。期间是行。每行都有一个名为 Documents 的列。我有一个 PeriodListViewModel 1 : N DocumentListViewModel。
DocumentListViewModel 是使用包含 ListBox 的 UserControl 和下面的一些按钮添加/删除/保存/打开等的数据模板化...
DocumentListViewModel 具有在“LessonController”中执行的命令和操作委托,因此对 Document 的每个操作(如添加、删除等)都可以在 LessonController 中声明的 SelectedPeriodViewModel 上完成。
当用户更改日期选择器中的日期时,上面的代码只是从数据库中加载新数据。
您是否需要更多代码,或者您对我的方法有何看法?我渴望学习,我为每一个批评者感到高兴!
【问题讨论】:
-
在一个窗口中有 6 或 60 个“用户”控件并没有错。只有可用和不可用的 UI。
标签: mvvm communication viewmodel mediator