1

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

中介者模式或信使类。但是一个窗口中有 6 个 ViewModel 呢?

  1. 新学校类用户控件
  2. 新瞳孔用户控件
  3. SchoolclassListUserControl
  4. 瞳孔列表用户控件
  5. 学生详细信息用户控件
  6. AdministrationButtonBarUserControl(具有执行命令的按钮)

所有这些都在一个窗口中。“你”现在真的告诉我我必须为这 6 个视图及其 Viewodels 设置一个 Messenger 吗?那将是可怕的...

一个窗口中有 6 个用户控件,即使是大型企业应用程序在一个窗口中也没有更多的用户控件,那么在这种情况下,什么是公认的/最佳实践?

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

其中一些 UserControl+ViewModel 我想在我的应用程序的其他地方重用。因此,将所有内容放在一个 UserControl 中并不是我真正想要的。

更新:对于盲目的meise ;-)

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 的每个操作(如 add、del 等)都可以在 LessonController 中声明的 SelectedPeriodViewModel 上完成。

上面的代码只是在用户更改日期选择器中的日期时从数据库中加载新数据。

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

4

1 回答 1

1

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

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

编辑:真的很难说你能做得更好,因为我不知道你想用你的应用程序和你的应用程序设计实现什么:) 一般来说,这取决于你如何为你的视图模型指定任务以及你想要如何耦合这些视图模型。也许你应该从 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)
     }
 }

now all other loosly coupled viewmodels could register to the mediator and the "SelectedDateChanged" message and do what the want to do when a date changed. this maybe does not fit in your design, but should give you an idea on the messenger pattern.

于 2010-10-14T06:02:57.530 回答