【问题标题】:WPF MVVM - Binding DataGrid to ObservableCollection of ModelWPF MVVM - 将 DataGrid 绑定到模型的 ObservableCollection
【发布时间】:2016-08-28 04:29:03
【问题描述】:

我对 WPF MVVM 很陌生,如果我对 MVVM 概念的理解有误,请见谅。

我的视图中有一个DataGrid,我已将ItemsSource 绑定到视图模型中的ObservableCollection<M>M 类是一个模型类。但是,M 类具有 bool 属性,这些属性将在 DataGrid 中显示为 "Yes/No" 字符串。

目前,我正在使用转换器将bool 值转换为string。但是,ViewModel 将 Model 的列表 (ObservableCollection) 暴露给 View 感觉是错误的。我也有read,在 MVVM 中,转换应该在 ViewModel 上完成。那么,为DataGrid 实现这种 MVVM 方式的正确方法是什么?

【问题讨论】:

    标签: wpf mvvm datagrid observablecollection


    【解决方案1】:

    理想世界中,您可以将Model 对象包装在它们自己的ViewModel 中,以便您的ObservableCollection 包含具有bool Model 属性的ViewModel 类型转换为是/否 string 属性。

    然而,在一个务实的世界里,如果你不编辑这些值,我不会费心去注意,如果你暴露了很多 bool 属性并且有成千上万个行,当DataGrid 为每个属性和行实例化一个Converter 时,您将在渲染网格时受到性能影响。

    【讨论】:

    • AutoGenerateColumns 属性设置为 false,我正在定义自己的列。所以在列定义中,转换器是StaticResources,我认为它不会实例化多个Converters,对吧?
    • 我也在考虑绑定到Observable<ViewModel>,但就我而言,我知道表(DataGrid)肯定并且总是有一行(意思是说它总是有只有一个模型实例)。我几乎想在 ViewModel 中硬编码它,完全不为它实现模型,但是当我想到 MVVM 时我停下了。
    【解决方案2】:

    使用转换器并不是错误的方法。根据我的建议,您应该像现在一样绑定数据,并在视图中创建并使用 BoolToStringConverter 将布尔值转换为是或否。

    【讨论】:

    • 是的,我已经有一个BoolToYesNoConverter,但我只是觉得奇怪的是视图知道模型属性并直接操作它们。将视图与模型结合在一起。
    • 那不是耦合。那是你的要求。当模型更新时,应该更新视图。这种同步使您的应用程序保持活力。
    • 这是在 MVVM 中做事的正常方式。但是,如果您愿意在视图模型中进行转换,那也可以。获取一个字符串属性以绑定到该字段,当您从视图模型从数据库中获取值时,您可以进行转换。
    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 2013-10-14
    • 2014-08-23
    • 1970-01-01
    • 2018-02-07
    • 2017-02-08
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多