如何在MVVM中的差异视图之间同步(建模)数据

时间:2011-11-09 09:00:08

标签: c# wpf mvvm

我正在尝试在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中的相应项无法更新其颜色。

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

2 个答案:

答案 0 :(得分:2)

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

1& 2)如果2个VM由同一个父对象实例化,则可以通过INotifyPropertyChangedEvents连接更新的属性

3)如果断开连接,您可以使用 EventAggregator 在VM之间发送消息。 CaliburnMicro有一个非常好的实现,但你可以用两个类自己构建一个。有关详细信息,请参阅:Caliburn.Micro Soup to Nuts Part 8–The EventAggregator

答案 1 :(得分:0)

如果不确切知道您的SelectedPersonPeople列表是如何相关的,则很难回答。因此,我假设SelectedPersonPeople列表中的一项。如果是这种情况,您的问题是,根据人的年龄显示颜色的视图控件不会获知有关值更改的信息。

此信息通常使用实现INotifyPropertyChanged的视图模型完成。每次属性更改时(在您的情况下)Age的属性PersonViewModel,都会引发PropertyChanged事件,因此所有绑定项都会知道值更改,因此会重新查询它们的值。