使用ViewModels的网格 - WPF

时间:2009-08-05 13:10:41

标签: wpf gridview viewmodel

很抱歉,如果已经提出这个问题,但我只是想确保我这样做。

如果我有一个domian对象,它上面有10个属性。我的主表单上有一个网格,我想要显示模型中的所有属性。

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

所以例如我真的不喜欢这个:

 {Binding DomainObject.Property}

其中DomainObject是我视图模型的属性。

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

编辑:只是为了补充信息,domian对象是LINQ-To-SQL对象,所以我认为他们没有实现INotifyPropertyChanged,但我不确定。

3 个答案:

答案 0 :(得分:3)

有些人会说没关系,有人说会这么做。我出现在后一阵营,原因如下:

  • 您增加了视图的依赖关系,因为它现在取决于数据模型,而不仅仅是视图模型。
  • 您需要设计人员了解数据模型的属性和结构。
  • 当您决定需要一个间接层来进行格式化,验证或其他任何重构时,您可以为(几乎不可避免的)重构创建更多工作。
  • 正如托马斯指出的那样,数据模型通常不会实施变更通知

是的,这是一项更多的工作,但我相信减少脱钩,维护问题,与设计师合作以及正确性是值得的。

PS。如果您发现自己处于这种情况中,可能会考虑ICustomTypeDescriptor的实现,它包装任何数据对象并使用更改通知公开其属性。这样,您的VM可以扩展此通用包装,直到您决定需要将属性拉出来进行格式化和验证等目的。

答案 1 :(得分:1)

如果您需要对属性进行更改通知,并且模型未实现INotifyPropertyChanged,则需要在ViewModel上创建新属性。否则,直接绑定到模型可能不是一个大问题:MVVM模式只是一个指导,如果需要你可以稍微弯曲规则......

答案 2 :(得分:0)

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

但是,只有在您的Model实现更改通知以便数据绑定有效时,这才有效。