我目前在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绑定它会立即工作。
在树视图中不使用相同模型的原因是,当获取导致性能问题的所有内容时,这些模型的信息比显示的要多得多。
答案 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中实现ObservableCollection
和INotifyPropertyChanged
。您可能想要创建一个LayoutItemViewModel
来封装LayoutItemDTO
。
我还建议您查看现有的工具包和框架,这些工具包和框架可以帮助实施&#34;管道代码&#34;对于MVVM(如INotifyPropertyChanged
实现)。我主要使用MVVM Light,但根据您的需要,还有很多其他的可用。
这也是以MVVM方式实现TreeView数据绑定的一个很好的链接:Simplifying the WPF TreeView by Using the ViewModel Pattern