gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:40:43 24 4
gpt4 key购买 nike

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

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

  • NewSchoolclassUserControl
  • 新瞳孔用户控件
  • SchoolclassListUserControl
  • 瞳孔列表用户控件
  • PupilsDetailUserControl
  • AdministrationButtonBarUserControl
    (有按钮执行命令)

  • 所有这些都在一个窗口中。 “你”现在真的告诉我我必须为这 6 个 View 及其 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”中执行的命令和操作委托(delegate),因此对 Document 的每个操作(如 add、del 等)都可以在 LessonController 中声明的 SelectedPeriodViewModel 上完成。

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

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

    最佳答案

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

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

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

    想象一下你有一个 View 模型,它什么都不做,然后选择一个日期。这将是一个简单的松耦合虚拟机。您现在所能做的就是在选择新日期时通过信使发送消息。

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

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

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

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

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

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com