WPF MVVM OnProperty更改了两个视图模型通信
我有一个WPF应用程序,它使用一个名为Visit的业务对象,它有很多子对象,比如patient、Check和其他。有用于编辑这些不同子对象的视图和视图模型,因此有一个用于编辑患者信息的视图和视图模型,还有一组用于检查信息等。还有一个主窗口视图模型 当我需要打开一个新的访问,我有一个搜索屏幕,也有它自己的视图模型。它需要从数据库中打开新的访问,并通知所有其他视图访问已更改 我已经研究了WeakEventManager,还有一个视图模型是所有其他视图模型的父视图模型,但我不确定最好的方法是什么。我想知道视图模型之间的关系应该是什么,以及打开/搜索视图模型应该如何告诉所有其他视图进行更新。更新属性时,我一直在视图模型中调用OnPropertyChanged(“propname”),但由于其他视图不知道open/search视图模型,所以他们不在乎我是否说OnPropertyChanged(“Visit”)看看这篇关于WPF MVVM OnProperty更改了两个视图模型通信,wpf,mvvm,viewmodel,Wpf,Mvvm,Viewmodel,我有一个WPF应用程序,它使用一个名为Visit的业务对象,它有很多子对象,比如patient、Check和其他。有用于编辑这些不同子对象的视图和视图模型,因此有一个用于编辑患者信息的视图和视图模型,还有一组用于检查信息等。还有一个主窗口视图模型 当我需要打开一个新的访问,我有一个搜索屏幕,也有它自己的视图模型。它需要从数据库中打开新的访问,并通知所有其他视图访问已更改 我已经研究了WeakEventManager,还有一个视图模型是所有其他视图模型的父视图模型,但我不确定最好的方法是什么。我想
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类的基础