【问题标题】:Grids with ViewModels - WPF带有 ViewModel 的网格 - WPF
【发布时间】:2009-08-05 13:10:41
【问题描述】:

很抱歉,如果这已经被问到了,但我只是想确保我这样做是正确的。

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

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

例如,我不太喜欢这样:

 {Binding DomainObject.Property}

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

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

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

【问题讨论】:

    标签: wpf gridview viewmodel


    【解决方案1】:

    有些人会说没关系,有些人会说没关系。我属于后者,原因如下:

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

    是的,这需要做更多的工作,但我认为减少解耦、维护问题、与设计师的协作以及正确性是值得的。

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

    【讨论】:

    • 格式化和验证是我在考虑会导致问题的东西。
    • 我正在编写的程序很小,所以我认为我不会使用 ICustomTypeDescriptor 方式,但很高兴知道。
    • 我已经建议一所大学实施 ICustomTypeDescriptor 以解决相同类型的 MVVM 困境。我认为对于那些希望将视图与模型严格分离但有一个复杂的系统要实现且需要写入许多变形器的人来说,这将是一个很好的起点。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-11-02
        • 2017-03-14
        • 2011-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-22
        相关资源
        最近更新 更多