3

抱歉,如果这已经被问过了,但我只是想确保我做对了。

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

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

因此,例如,我不太喜欢这样:

 {Binding DomainObject.Property}

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

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

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

4

3 回答 3

3

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

  • 您增加了视图的依赖关系,因为它现在依赖于数据模型,而不仅仅是视图模型。
  • 你要求设计者需要知道你的数据模型的属性和结构。
  • 当您决定需要一个间接层来进行格式化、验证或任何可能的事情时,您会为(几乎不可避免的)重构创建更多工作。
  • 正如 Thomas 所指出的,数据模型通常不会实现更改通知

是的,这需要更多的工作,但我相信减少解耦、维护头痛、与设计师的协作以及正确性是值得的。

PS。如果您经常遇到这种情况,您可能会考虑使用 ICustomTypeDescriptor 的实现来包装任何数据对象并通过更改通知公开其属性。这样,您的 VM 可以扩展此通用包装器,直到您决定需要提取属性以用于格式化和验证等目的。

于 2009-08-05T13:24:37.510 回答
1

如果您需要关于属性的更改通知并且模型没有实现 INotifyPropertyChanged,那么您需要在 ViewModel 上创建新属性。否则,直接绑定到模型可能不是什么大问题:MVVM 模式只是一个指导方针,如果需要,您可以稍微改变规则......

于 2009-08-05T13:16:38.500 回答
0

我认为这是个人喜好问题。我碰巧相信在 ViewModel 的单个对象中公开模型是完全可以的。在 ViewModel 中重新创建模型的所有属性只会导致一堆额外的代码。

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

于 2009-08-05T13:22:37.073 回答