6个ViewModel和Messenger == AntiPattern之间的通信?

时间:2010-10-13 21:27:09

标签: mvvm communication viewmodel mediator

2个ViewModel之间通信的常用方法是:MVVM- View Model-View Model Communications

Mediator模式或Messenger类。但是在一个窗口中有6个ViewModels呢?

  1. NewSchoolclassUserControl
  2. NewPupilUserControl
  3. SchoolclassListUserControl
  4. PupilListUserControl
  5. PupilsDetailUserControl
  6. AdministrationButtonBarUserControl (有按钮执行命令)
  7. 这一切都在一个窗口中。 “你”真的告诉我现在我必须为这6个视图及其视图设置一个Messenger吗?那太可怕了......

    在一个窗口中有6个UserControl,甚至一个大型企业应用程序在一个窗口中都有更多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进行datatemplated。期间是行。每行都有一个名为Documents的列。我有一个PeriodListViewModel 1:N DocumentListViewModel。

    使用包含ListBox的UserControl对DocumentListViewModel进行datatemplated,并在下面添加/ del / save / open等按钮...

    DocumentListViewModel具有在“LessonController”中执行的命令和操作委托,因此可以在LessonController中声明的SelectedPeriodViewModel上完成文档上的每个操作,如add,del等。

    当用户更改datepicker中的日期时,上面的代码只会从数据库加载新数据。

    您需要更多代码或者您对我的方法有什么看法?我渴望学习,每个评论家都很高兴!

1 个答案:

答案 0 :(得分:1)

如果您有6个或1000个松散耦合的视图模型,它们应该相互通信,那么您应该使用messenger / mediator。它根本与用户控制无关。

如果你的视图模型相互引用,那么你就不需要信使,但它不再松散耦合,然后:)

编辑: 很难说你有什么可以更好,因为我不知道你想用你的应用程序和你的appdesign实现什么:)一般来说这取决于你如何为你的视图模型指定任务以及你想如何结合这些的ViewModels。也许你应该从www上检查一些示例项目:)有很多mvvm实现有很多不同但是对mvvm模式有更好的理解(模式!!不规则!!;))

想象你有一个什么都不做的viewmodel然后选择一个日期。这将是一个简单的松耦合vm。您现在可以做的就是选择新日期时,通过信使发送信息。

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

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

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

现在所有其他松散耦合的视图模型都可以注册到调解器和“SelectedDateChanged”消息,并在日期更改时执行想要执行的操作。 这可能不适合您的设计,但应该让您了解信使模式。