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

C# 如何在MVVM中的不同视图之间同步(模型)数据,c#,wpf,mvvm,C#,Wpf,Mvvm,我试图在MVVM中的不同视图之间同步数据 以下是场景: 分别有两个视图模型和两个视图: ViewModel1:包含名为“People”的“Person”对象列表,该对象在实体框架中定义,并通过WCF服务检索 View1:包含一个ItemsControl,它绑定到ViewModel的“人员”。项目的颜色可能因其值而异,例如:60岁以上的人可能显示为红色,而18岁以下的人可能显示为绿色。这是通过值转换器实现的 (View1中有一个名为“显示详细信息”的按钮,单击该按钮时,将弹出一个“子窗口”对话框,

我试图在MVVM中的不同视图之间同步数据

以下是场景:

分别有两个视图模型和两个视图:

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

View1:包含一个ItemsControl,它绑定到ViewModel的“人员”。项目的颜色可能因其值而异,例如:60岁以上的人可能显示为红色,而18岁以下的人可能显示为绿色。这是通过值转换器实现的

(View1中有一个名为“显示详细信息”的按钮,单击该按钮时,将弹出一个“子窗口”对话框,并显示当前选定“人员”的详细信息)

ViewModel2:包含一个“SelectedPerson”对象,并实现一个“Save”方法

View2:包含多个绑定到“SelectedPerson”对象的相应字段的输入字段,例如“Person.FirstName”的文本框、“Person.Birth”的日期时间选择器、“Person.Gender”的单选按钮等

问题:

当我更改一些字段(即“名称”字段)并单击“保存”按钮时,我甚至可以看到更改已提交到数据库中。但是,View1中的相应项无法更新其颜色


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

如果不确切知道您的
SelectedPerson
和您的
人员列表是如何关联的,就很难回答。因此,我假设
SelectedPerson
People
列表中的一项。如果是这种情况,您的问题是,根据人的年龄显示颜色的视图控件没有收到有关值更改的通知


此信息通常通过实现INotifyPropertyChanged的视图模型完成。每次属性更改时,您的
PersonViewModel
的属性
Age
都会引发PropertyChanged事件,因此所有绑定项都知道值的更改,因此将重新查询其值。

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

1&2)如果两个虚拟机由同一父对象实例化,则可以通过更新属性的
INotifyPropertyChanged
事件连接它们


3)如果它们断开连接,您可以使用事件聚合器来在虚拟机之间传递消息。CaliburnMicro有一个非常好的实现,但是您可以自己用两个类构建一个。有关更多信息,请参见:

查看我的答案-它解决了一个类似的问题:VM1中的“人员”列表是否是可观察的集合?如果没有,则将其更改为ObservableCollection。我的假设是,对列表的更改不会传播到UI。@如果项目在不传播此更改的情况下更改其内部状态,SvenG ObservableCollection将不会引发任何事件。Person对象列表是如何创建的?你在使用数据集/数据表吗?@Steve Greatrex谢谢你的建议。您的回复帮助我找到解决方案。谢谢您的建议。你的答复帮助我解决了这些问题。