WPF MVVM OnPropertyChanged 两个 ViewModel 通信

标签 wpf mvvm viewmodel

我有一个 WPF 应用程序,它使用一个名为 Visit 的业务对象,它有很多子对象,如患者、考试等。有用于编辑这些各种子对象的 View 和 View 模型,因此有用于编辑患者信息的 View 和 View 模型以及用于检查信息等的集合。还有一个主窗口 View 模型。

当我需要打开一个新的访问时,我有一个搜索屏幕,它也有它自己的 View 模型。它需要从数据库中打开新的访问并通知所有其他 View 该访问已更改。

我研究了 WeakEventManager,并且还有一个 View 模型是所有其他 View 模型的父级,但我不确定什么是最好的方法。我想知道 View 模型之间的关系应该是什么,以及打开/搜索 View 模型应该如何告诉所有其他 View 进行更新。当属性更新时,我一直在我的 View 模型中调用 OnPropertyChanged("propname"),但是由于其他 View 不知道打开/搜索 View 模型,所以他们不在乎我是否说 OnPropertyChanged("Visit")

最佳答案

看看这个post on SO谈论Messenger .在您的情况下,您发布 Visit 对象并让 ViewModel 捕获该对象以进行显示。

如果您有一个非常以数据为中心的 View ,Model数据几乎直接显示在 View无需大量修改即可轻松公开 Model作为 ViewModel 上的属性(property)并拥有 View绑定(bind)到它的属性。

这样当一个View更新 Model其他View的将自动更新,而无需监听 Model 上的属性更改事件。

编辑:

详细说明我的第二点:您可能需要也可能不需要,但如果您的 Model还实现了INotifyPropertyChanged那么对该模型的任何更改都将传播到 View自动地。

如果您需要有 2 个带有 Visit 对象的 View ,那么您可以将 Visit 属性直接绑定(bind)在 XAML 中

public class ViewModel1 : ViewModelBase
{
   public ViewModel1(IMessenger messenger)
   {
       messenger.Register<Visit>(this, (v) => CurrentVisit = v);
   }

   public Visit CurrentVisit
   {
      get { _visit; }
      set { _visit = value; RaiseNotifyPropertyChange("CurrentVisit"); }
   }
}

public class ViewModel2: ViewModelBase
{ 
   public ViewModel2(IMessenger messenger)
   {
       messenger.Register<Visit>(this, (v) => CurrentVisit = v);
   }

   public Visit CurrentVisit
   {
      get { _visit; }
      set { _visit = value; RaiseNotifyPropertyChange("CurrentVisit"); }
   }
}

public class CurrentVisit : INotifyPropertyChanged
{ ... }

就像我说的,这仅适用于您需要相同的 Visit对象共享 2 个或更多 ViewModel s 并且如果 View的主要以数据为中心,换句话说,来自 Model 的数据直接呈现在屏幕上。这是为了避免复制 ViewModel 中的属性。 s 并且必须一直引发属性更改事件。

关于WPF MVVM OnPropertyChanged 两个 ViewModel 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8538987/

相关文章:

c# - 如何对具有多个子层的根 ViewModel 进行单元测试?

c# - 无法覆盖 WPF 中 app.xaml 的按钮样式

wpf - 列表框项目源不随源更新

c# - 将事件绑定(bind)到 Item ViewModel

c# - Xamarin表格: How notify my previous viewmodel than is observable collection need to be modified?

android - 使用 Hilt 将 ViewModel 注入(inject) ViewModel

mvvm - 如何通过 ViewModel 实现的 onclick Binding Adapter 获取 Position 和 View 信息?

c# - 选中图形对象

asp.net-mvc - 以列表形式显示 View 中多个表中的数据-ASP.Net MVC

unit-testing - 如何在 MVVM-Light 框架中对 View 模型进行单元测试?