我有一个 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/