C# 具有不同DTO的viewmodels之间的MVVM通信';s

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中,我有一个树状视图和一个显示区域,当我双击树状视图中的一个项目时,可以显示项目的更多详细信息以进

我目前在EF有三个模型(房子、房间、物品)

公共类房屋
{
属性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; }
}