2014-10-22 65 views
2

我目前在EF(House,Room,Item)中有三种模型。不同DTO的viewmodels之间的MVVM通信

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和一个显示区域显示的项目进行修改的详细信息,当我双击在树视图中单击某个项。

我的TreeView,以提高性能调用web服务返回以下DTO/s的

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

这些DTO的映射使用查询到的房子,房间,项目模型数据库建立。

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

当用户双击房间时(即向房间添加/删除项目),也会发生同样的情况。

除了保持树形视图和打开的视图不同步之外,这一切都很有效,所以如果它们改变了房间的名称或添加/删除了一个项目,我希望它在内存中的树视图中反射,并在它们取消更改时恢复关闭。

目前我已经完成了这个使用事件聚合器,但它似乎不整洁的调用每个动作的事件,如果我可以使用WPF绑定它会立即工作。

在树形视图中不使用相同模型的原因是由于这些模型在获取所有导致性能问题的所有信息时比它们显示的信息多得多。

回答

0

数据绑定和INotifyPropertyChanged的

如果您希望您的对象更改的UI使用数据绑定中反映出来,你要实现你的模型类INotifyPropertyChanged接口(或在视图模型,如果你正在使用MVVM模式)。

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

你可以在这里找到一个例子:How to: Implement the INotifyPropertyChanged Interface

集合

对于集合,如果集合实现INotifyCollectionChanged WPF数据绑定将工作。 List<T>类型没有实现这个接口,所以TreeView不会反映从列表中添加/删除。 ObservableCollection<T>类型实现此接口,因此您只需将List<LayoutItemDTO>更改为ObservableCollection<LayoutItemDTO>,并且应该反映更改。

MVVM

至于你提到使用MVVM,我想补充一点,我通常会在我的ViewModels ObservableCollectionINotifyPropertyChanged实现。您可能想要创建一个LayoutItemViewModel,它将封装一个LayoutItemDTO

我还可以建议你看看现有的工具包和框架,这些工具包和框架可以帮助实现MVVM的“管道代码”(如INotifyPropertyChanged实现)。我主要使用MVVM Light,但根据您的需求还有许多其他的功能。

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

+0

感谢你好了,我们确实有这些DTO的的ViewModels所以树形视图有layoutviewmodel的反应和看法时,这是开放的有houseviewmodel与嵌套视图模型的房间和这些项目后,用户已经双击树视图和第二次服务调用已建立。当我们在树视图中更改任何这些项目时,或者在它们后面具有不同视图模型的打开视图中时,问题就会起作用。我们需要一种方法来在两者之间建立一个共同的相关视图模型 – jclarkson 2014-10-28 15:36:49