WPF MVVM OnProperty更改了两个视图模型通信

WPF MVVM OnProperty更改了两个视图模型通信,wpf,mvvm,viewmodel,Wpf,Mvvm,Viewmodel,我有一个WPF应用程序,它使用一个名为Visit的业务对象,它有很多子对象,比如patient、Check和其他。有用于编辑这些不同子对象的视图和视图模型,因此有一个用于编辑患者信息的视图和视图模型,还有一组用于检查信息等。还有一个主窗口视图模型 当我需要打开一个新的访问,我有一个搜索屏幕,也有它自己的视图模型。它需要从数据库中打开新的访问,并通知所有其他视图访问已更改 我已经研究了WeakEventManager,还有一个视图模型是所有其他视图模型的父视图模型,但我不确定最好的方法是什么。我想

我有一个WPF应用程序,它使用一个名为Visit的业务对象,它有很多子对象,比如patient、Check和其他。有用于编辑这些不同子对象的视图和视图模型,因此有一个用于编辑患者信息的视图和视图模型,还有一组用于检查信息等。还有一个主窗口视图模型

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

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

看看这篇关于
Messenger的文章。在您的案例中,您可以发布访问对象,并让ViewModel捕获该对象以进行显示

如果您有一个非常以数据为中心的视图,其中
模型
数据几乎直接显示在
视图
上,而无需进行大量修改,您可以轻松地将
模型
作为
视图模型
上的属性公开,并将
视图
绑定到其属性

这样,当一个
视图
更新
模型
时,另一个
视图
将自动更新,而无需监听
模型上的属性更改事件

编辑:

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

如果需要有两个带有访问对象的视图,则可以在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
{ ... }
公共类ViewModel1:ViewModelBase
{
公共视图模型1(IMessenger messenger)
{
messenger.Register(此,(v)=>CurrentVisite=v);
}
公众参观
{
获得{u访问;}
设置{u visit=value;RaiseNotifyPropertyChange(“当前访问”);}
}
}
公共类ViewModel2:ViewModelBase
{ 
公共视图模型2(IMessenger messenger)
{
messenger.Register(此,(v)=>CurrentVisite=v);
}
公众参观
{
获得{u访问;}
设置{u visit=value;RaiseNotifyPropertyChange(“当前访问”);}
}
}
公共类当前访问:INotifyPropertyChanged
{ ... }

如我所说,这仅适用于需要相同的
访问
对象共享2个或更多
视图模型
的情况,并且如果
视图
主要以数据为中心,或者换句话说,来自
模型
的数据直接显示在屏幕上。这是为了避免重复视图模型中的属性,并且必须始终引发属性更改事件。

使用全局变量。只需在基础ViewModel类中使用一个属性,该属性的set part设置全局变量,get part返回该变量值。。。要设置该全局变量,请在其他公共项目中创建一个类,并创建一个静态公共变量或属性。

。如果您有许多断开连接的视图模型需要相互通知,MesageBus方法确实会有所帮助。谢谢,请您详细说明:“这样,当一个视图更新模型时,另一个视图将自动更新,而不必侦听模型上的属性更改事件”——这到底是如何工作的,你能给我举个例子或者详细说明一下吗?所以如果我在viewModel中有一个属性,叫做CurrentVisit,我对它做了一个更改,它如何在所有视图中自动更新,我还需要调用OnPropertyChanged吗?对不起,我不明白。刚刚更新了你的问题。在您的情况下可能需要,也可能不需要。对不起,我指的是viewmodel类的基础