具有不同DTO的视图模型之间的MVVM通信

时间:2014-10-22 09:29:14

标签: c# wpf performance design-patterns mvvm

我目前在EF(House,Room,Item)中有三个模型。

public class House
{
   property int ID { get; set; }
   property string Name { get; set; }
   property List<Room> Rooms { get; set; }
}

public class Room
{
   property int ID { get; set; }
   property string Name { get; set; }
   property List<Item> Items { get; set; }
}

public class Item
{
   property int ID { get; set; }
   property string Name { get; set; }
}

在我的UI中,我有一个Treeview和一个显示区域,当我双击树视图中的项目时,可以显示项目的更多细节以供修改。

我的树视图提高了性能,调用了一个返回以下DTO / s的Web服务

public class LayoutItemDTO
{
   property int ID { get; set; }
   property string Name { get; set; }
   property List<LayoutItemDTO> Children { get; set; }
}

使用查询到房屋,房间,项目模型上的数据库来构建这些DTO。

现在,当用户双击树视图上的一个房产项时,它会调用一个Web服务,将带有房间集合的房屋模型返回到用户添加/删除房间的视图中,当他们关闭视图时,它会提示保存

当用户双击房间时(即向房间添加/移除物品)也会发生同样的情况。

这一切都很有效,除了保持树视图和打开的视图同步,所以如果他们更改房间的名称或添加/删除我希望它反映在内存中的树视图中的项目,如果他们取消了更改,则还原关闭。

目前我已经使用事件聚合器完成了这项工作,但是对于每个操作来说似乎都是不整齐的调用事件,如果我可以使用WPF绑定它会立即工作。

在树视图中不使用相同模型的原因是,当获取导致性能问题的所有内容时,这些模型的信息比显示的要多得多。

1 个答案:

答案 0 :(得分:0)

数据绑定和INotifyPropertyChanged

如果您希望使用数据绑定在UI中反映对象的更改,则必须在模型类中实现INotifyPropertyChanged接口(如果使用MVVM模式,则必须在ViewModel中实现)。

通过实现界面,每次修改属性值时都会触发一个事件(PropertyChanged),并且对该属性进行数据绑定的控件将刷新以显示新值。

您可以在此处找到示例:How to: Implement the INotifyPropertyChanged Interface

<强>集合

对于集合,如果集合实现INotifyCollectionChanged,WPF数据绑定将起作用。 List<T>类型没有实现此接口,因此TreeView不会反映列表中的添加/删除。类型ObservableCollection<T>实现了此界面,因此您只需将List<LayoutItemDTO>更改为ObservableCollection<LayoutItemDTO>即可反映更改。

<强> MVVM

正如您提到的使用MVVM,我想补充一点,我通常会在我的ViewModel中实现ObservableCollectionINotifyPropertyChanged。您可能想要创建一个LayoutItemViewModel来封装LayoutItemDTO

我还建议您查看现有的工具包和框架,这些工具包和框架可以帮助实施&#34;管道代码&#34;对于MVVM(如INotifyPropertyChanged实现)。我主要使用MVVM Light,但根据您的需要,还有很多其他的可用。

这也是以MVVM方式实现TreeView数据绑定的一个很好的链接:Simplifying the WPF TreeView by Using the ViewModel Pattern