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

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

  • NewSchoolclassUserControl
  • NewPupilUserControl
  • SchoolclassListUserControl
  • PupilListUserControl
  • PupilsDetailUserControl
  • AdministrationButtonBarUserControl
    (具有执行命令的按钮)

  • 所有这些都在一个窗口中。现在,“您”真的告诉我,我必须为这6个 View 及其Viewodels设置Messenger吗?那太可怕了...

    在一个窗口中有6个UserControl,甚至没有一个大型企业应用程序在一个窗口中也没有更多的UserControl,那么在这种情况下,什么是可接受的/最佳实践呢?

    我会对有大型mvvm应用程序经验的人的观点感兴趣:)

    我想在应用程序的其他位置重用其中一些UserControl + ViewModel。因此,将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是使用包含一个ListBox的UserControl进行数据模板化的,并且在某些按钮下方有添加/删除/保存/打开等...

    DocumentListViewModel具有在“LessonController”中执行的命令和 Action 委托(delegate),因此可以对在DocumentController中声明的SelectedPeriodViewModel进行的对文档的每个 Action (如add,del等)都可以进行。

    当用户更改日期选择器中的日期时,以上代码仅从数据库中加载新数据。

    您是否需要更多代码,或者您对我的方法有何评价?我渴望学习,对每个批评家感到高兴!

    最佳答案

    如果您有6或1000个松耦合的 View 模型,它们应该相互通信,则应该使用Messenger/介体。它与用户控件完全无关。

    如果您的 View 模型相互引用,则您不需要使者,但不再需要松散耦合:)

    编辑:
    真的很难说你能做些什么,因为我不知道你想用你的应用程序和appdesign实现什么:)一般来说,这取决于你如何为 View 模型指定任务以及如何将它们耦合在一起 View 模型。也许您应该从www上检查一些示例项目:)有很多mvvm实现,它们的变化很大,但是可以更好地理解mvvm模式(模式!

    假设您有一个不执行任何操作的viewmodel,然后选择了一个日期。这将是一个简单的松散耦合的虚拟机。您现在所能做的就是选择一个新日期后,通过信使发送一条消息。

    public DateTime SelectedDate
    {
        get { return _selectedDate; }
        set
        {
             if (_selectedDate == value)
                 return;
    
              _selectedDate = value;
              this.RaisePropertyChanged("SelectedDate");
    
              this.messenger.Notify("SelectedDateChanged", this.SelectedDate)
         }
     }
    

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

    关于mvvm - 6个ViewModels与Messenger之间的通信== AntiPattern?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3928179/

    10-11 14:23