C# 具有不同DTO的viewmodels之间的MVVM通信';s
我目前在EF有三个模型(房子、房间、物品)C# 具有不同DTO的viewmodels之间的MVVM通信';s,c#,wpf,performance,design-patterns,mvvm,C#,Wpf,Performance,Design Patterns,Mvvm,我目前在EF有三个模型(房子、房间、物品) 公共类房屋 { 属性int ID{get;set;} 属性字符串名称{get;set;} 属性列表房间{get;set;} } 公共教室 { 属性int ID{get;set;} 属性字符串名称{get;set;} 属性列表项{get;set;} } 公共类项目 { 属性int ID{get;set;} 属性字符串名称{get;set;} } 在我的UI中,我有一个树状视图和一个显示区域,当我双击树状视图中的一个项目时,可以显示项目的更多详细信息以进
公共类房屋
{
属性int ID{get;set;}
属性字符串名称{get;set;}
属性列表房间{get;set;}
}
公共教室
{
属性int ID{get;set;}
属性字符串名称{get;set;}
属性列表项{get;set;}
}
公共类项目
{
属性int ID{get;set;}
属性字符串名称{get;set;}
}
在我的UI中,我有一个树状视图和一个显示区域,当我双击树状视图中的一个项目时,可以显示项目的更多详细信息以进行修改
为了提高性能,我的treeview调用了一个webservice,它返回以下DTO/s
public class LayoutItemDTO
{
property int ID { get; set; }
property string Name { get; set; }
property List<LayoutItemDTO> Children { get; set; }
}
公共类LayoutItemDTO
{
属性int ID{get;set;}
属性字符串名称{get;set;}
属性列表子项{get;set;}
}
这些DTO是使用对房屋、房间和项目模型上的数据库的查询来映射和构建的
现在,当用户双击treeview上的房屋项目时,它会调用一个Web服务,将带有rooms集合的房屋模型返回到视图中,供用户添加/删除房间,当用户关闭视图时,它会提示保存
当用户双击某个房间(即向房间添加/删除项目)时,也会发生同样的情况
除了保持树视图和打开的视图同步外,这一切都非常有效,因此如果他们更改房间名称或添加/删除项目,我希望它反映在内存中的树视图中,如果他们在关闭时取消更改,则恢复
目前,我已经使用事件聚合器完成了这项工作,但是为每个操作调用事件似乎很不整洁,如果我可以使用WPF绑定,它将立即工作
不在树视图上使用相同模型的原因是,当获取所有信息时,这些模型的相关信息比显示的要多得多,这会导致性能问题。数据绑定和INotifyPropertyChanged 如果希望使用数据绑定将对象上的更改反映在UI中,则必须在模型类中实现
INotifyPropertyChanged
接口(如果使用MVVM模式,则在ViewModel中实现)
通过实现该接口,每次修改属性值时都会触发一个事件(PropertyChanged
),并且属性的数据索引控件将刷新以显示新值
您可以在此处找到一个示例:
收藏
对于集合,如果集合实现了INotifyCollectionChanged
,则WPF数据绑定将起作用。列表
类型未实现此接口,因此树视图不会反映列表中的添加/删除。类型ObservableCollection
实现了这个接口,因此您只需将List
更改为ObservableCollection
,并且应该反映更改
MVVM
正如您提到的使用MVVM,我要补充的是,我通常会在我的ViewModels中使用ObservableCollection
和INotifyPropertyChanged
实现。您可能需要创建一个LayoutItemViewModel
,它将LayoutItemDTO封装到
我还建议您看看现有的工具包和框架,它们对实现MVVM的“管道代码”有很大帮助(比如INotifyPropertyChanged
implementation)。我主要使用MVVM Light,但根据您的需要,还有很多其他的可用性
这里还有一个以MVVM方式实现TreeView数据绑定的好链接:您好,感谢您的回复,我们确实为这些DTO提供了viewmodels,因此TreeView具有layoutviewmodel,并且当该视图打开时,具有用于房间的嵌套viewmodels的houseviewmodel以及用户双击后生成的项目在树视图上,第二个服务呼叫已经发出。当我们在树视图或打开的视图中使用不同的ViewModel更改这些项目时,问题就出现了。我们需要一种方法在两者之间建立一个共同的相关视图模型
public class LayoutItemDTO
{
property int ID { get; set; }
property string Name { get; set; }
property List<LayoutItemDTO> Children { get; set; }
}