我正在尝试在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个虚拟机由相同的父对象实例化,这些虚拟机可以通过INotifyPropertyChanged
或Events
连接到更新的属性
3)如果它们断开连接,您可以使用EventAggregator在虚拟机之间发送消息。CaliburnMicro有一个很好的实现,但是你可以用两个类自己构建一个。有关更多信息,请参阅:Caliburn。微汤到坚果第八部分EventAggregator
如果不知道你的SelectedPerson
和People
列表是如何相关的,很难回答。所以我假设SelectedPerson
是People
列表中的一个项目。如果是这种情况,您的问题是,根据人的年龄显示颜色的视图控件没有得到关于值变化的通知。
此信息通常是通过实现INotifyPropertyChanged的视图模型完成的。每次属性发生变化时,在您的例子中是PersonViewModel
的Age
属性,PropertyChanged事件被引发,因此所有绑定项都知道值的变化,因此将查询它们的值。