我正在尝试在MVVM中的单独视图之间同步数据。
以下是该方案:
分别有两个ViewModel和两个Views:
ViewModel1:包含一个名为“People”的“Person”对象列表,该对象在Entity Framework中定义,并通过WCF服务检索。
View1:包含一个与ViewModel的“People”绑定的ItemsControl。项目的颜色可能因其值而异,例如:60岁以上的人可能会显示红色,而18岁以下的人可能会显示为绿色。这是通过Value Converter实现的。
(在View1中有一个名为“显示详细信息”的按钮,当它被点击时,会弹出一个ChildWindow对话框并显示当前所选“人物”的详细信息)
ViewModel2:包含“SelectedPerson”对象,并实现“保存”方法。
View2:包含绑定到“SelectedPerson”对象的相应字段的几个输入字段,例如“Person.FirstName”的TextBox,“Person.Birthday”的DateTimePicker,“Person.Gender”的RadioButton等。
问题:
当我更改了某些字段(即“名称”字段)并单击“保存”按钮时,我甚至可以看到已将更改提交到数据库。但是,View1中的相应项无法更新其颜色。
有没有更好的方法来解决这个问题?
答案 0 :(得分:2)
根据您的设置,您可以通过三种方式解决此类问题:
1& 2)如果2个VM由同一个父对象实例化,则可以通过INotifyPropertyChanged
或Events
连接更新的属性
3)如果断开连接,您可以使用 EventAggregator 在VM之间发送消息。 CaliburnMicro有一个非常好的实现,但你可以用两个类自己构建一个。有关详细信息,请参阅:Caliburn.Micro Soup to Nuts Part 8–The EventAggregator
答案 1 :(得分:0)
如果不确切知道您的SelectedPerson
和People
列表是如何相关的,则很难回答。因此,我假设SelectedPerson
是People
列表中的一项。如果是这种情况,您的问题是,根据人的年龄显示颜色的视图控件不会获知有关值更改的信息。
此信息通常使用实现INotifyPropertyChanged的视图模型完成。每次属性更改时(在您的情况下)Age
的属性PersonViewModel
,都会引发PropertyChanged事件,因此所有绑定项都会知道值更改,因此会重新查询它们的值。