带ViewModels的栅格-WPF

带ViewModels的栅格-WPF,wpf,gridview,viewmodel,Wpf,Gridview,Viewmodel,抱歉,如果已经有人问过这个问题,但我只是想确保我做得对 如果我有一个domian对象,上面有10个属性。我的主窗体上有一个网格,我想显示模型中几乎所有的属性 我创建了一个viewmodel来包装要在gridview中显示的域对象,但是我必须再次公开所有属性。我只是觉得通过viewmodel直接绑定到模型上,感觉有点脏,有点违背了目的 例如,我真的不喜欢这样: {Binding DomainObject.Property} 其中DomainObject是我的视图模型上的属性 所以我的主要问题是

抱歉,如果已经有人问过这个问题,但我只是想确保我做得对

如果我有一个domian对象,上面有10个属性。我的主窗体上有一个网格,我想显示模型中几乎所有的属性

我创建了一个viewmodel来包装要在gridview中显示的域对象,但是我必须再次公开所有属性。我只是觉得通过viewmodel直接绑定到模型上,感觉有点脏,有点违背了目的

例如,我真的不喜欢这样:

 {Binding DomainObject.Property}
其中DomainObject是我的视图模型上的属性

所以我的主要问题是,我是否应该通过视图模型公开模型上的所有属性,以便将其绑定到网格


编辑:只是为了增加信息,domian对象是LINQ To SQL对象,因此我不认为它们实现了INotifyPropertyChanged,但我不确定。

如果需要属性更改通知,而模型没有实现INotifyPropertyChanged,则需要在ViewModel上创建新属性。否则,直接绑定到模型可能不是什么大问题:MVVM模式只是一个指导原则,必要时可以稍微改变规则…

我认为这是个人偏好的问题。我碰巧相信,在ViewModel的单个对象中暴露模型是完全正确的。在ViewModel中重新创建模型的所有属性只会产生一堆额外的代码


但是,只有在模型实现更改通知以便数据绑定工作的情况下,这才有效

有些人会说没关系,有些人会说有关系。我属于后一个阵营,原因如下:

  • 增加视图的依赖性,因为它现在依赖于数据模型,而不仅仅是视图模型
  • 您需要设计者了解数据模型的属性和结构
  • 当您决定需要一个间接层来进行格式化、验证或任何可能的操作时,您将为重构(几乎不可避免)创建更多的工作
  • 正如Thomas指出的,数据模型通常不实现更改通知
是的,这是一个多一点的工作,但我相信它是值得的,以减少解耦,维护头痛,与设计师的合作,和正确性


< PS. >如果您发现自己处于这种情况下,可以考虑实现ICUSTORM Type描述符,它封装任何数据对象,并使用更改通知来公开其属性。这样,您的虚拟机可以扩展此通用包装,直到您决定需要提取属性以用于格式化和验证等目的。

格式化和验证是我一直在考虑的问题,可能会导致问题。我正在编写的程序非常小,因此我想我不会使用ICUSTOMTYPEDESCRIPOR是的,但很高兴知道。我建议一所大学实施ICustomTypeDescriptor,以解决同一类型的MVVM难题。我认为这将是一个很好的起点,对于那些希望从他们的模型中严格分离他们的观点,但有一个复杂的系统需要实现的人来说,这将需要向许多转化者写信。