如何在MVVM的不同视图之间同步(模型)数据



我正在尝试在MVVM的不同视图之间同步数据。

场景如下:

有两个ViewModels和两个Views分别:

ViewModel1:包含一个名为"People"的"Person"对象列表,该列表在实体框架中定义,并通过WCF服务检索。

View1:包含一个ItemsControl,它被绑定到ViewModel的"People"。物品的颜色可能会根据其值而变化,例如:60岁以上的人可能会显示红色,而18岁以下的人可能会显示绿色。这是通过一个值转换器实现的。

(View1中有一个名为"显示详细信息"的按钮,点击后弹出ChildWindow对话框,显示当前选中的"Person"的详细信息)

ViewModel2:包含一个"SelectedPerson"对象,并实现了一个"Save"方法。

View2:包含几个与"SelectedPerson"对象对应的字段绑定的输入字段,例如"Person"的TextBox。, DateTimePicker为"Person。生日",单选按钮表示"人"。性别"等。

问题:

,当我改变了一些字段(即"名称"字段)并点击"保存"按钮,我甚至可以看到更改已提交到数据库。但是,View1中对应的item更新其颜色失败。

有更好的方法来解决这个问题吗?

根据您的设置,通常可以通过三种方式解决此类问题:

1,2)如果2个虚拟机由相同的父对象实例化,这些虚拟机可以通过INotifyPropertyChangedEvents连接到更新的属性

3)如果它们断开连接,您可以使用EventAggregator在虚拟机之间发送消息。CaliburnMicro有一个很好的实现,但是你可以用两个类自己构建一个。有关更多信息,请参阅:Caliburn。微汤到坚果第八部分EventAggregator

如果不知道你的SelectedPersonPeople列表是如何相关的,很难回答。所以我假设SelectedPersonPeople列表中的一个项目。如果是这种情况,您的问题是,根据人的年龄显示颜色的视图控件没有得到关于值变化的通知。

此信息通常是通过实现INotifyPropertyChanged的视图模型完成的。每次属性发生变化时,在您的例子中是PersonViewModelAge属性,PropertyChanged事件被引发,因此所有绑定项都知道值的变化,因此将查询它们的值。