【问题标题】:combining viewmodel with model将视图模型与模型相结合
【发布时间】:2013-03-19 07:34:12
【问题描述】:

好的,这里还有一点需要思考。

MVVM 声明 Model 与 ViewModel 无关。因此,ViewModel 公开了要绑定的 View 的属性。

Microsoft 代码分析规则告诉我向模型中的公共变量添加一个属性。

警告:CA1051:Microsoft.Design:因为字段“Employee.name”是 在其声明类型之外可见,将其可访问性更改为 私有并添加一个属性,与字段具有相同的可访问性 目前,提供对它的访问权限。

现在它的 2 个重复属性,我宁愿让它 DRY,所以我正在考虑合并 ViewModel 和 View。这里还有一件事,Model 是一个 POCO,并且不会有 INotifyPropertyChanged,所以让 VM 知道 Model 值的变化是另一个问题。我使用了很多基于 IList 的绑定

会不会有我忽略的未来问题?

编辑:我忘了提,我看了how to correctly define Model to ViewModel relation?,我们软件中的另一件事是我们有一个单独的实体来填充 IList,它是一个服务/实用程序集。 EmployeeViewModel 位于一个单独的 VIEW 程序集中。所以我无法返回 ILIst。

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    不要这样做。我知道这听起来像是你不需要的很多额外的东西,但随着你的应用程序变得越来越复杂,它会得到回报。我发现绑定一个支持属性通知的 ViewModel 是绝对必要的,它可以让我以视图可以轻松使用的方式呈现数据,而无需绑定到模型中的表示 - ViewModel 根据需要在两者之间进行转换.

    如果您没有这些层,那么将来对事物进行更改,尤其是在您通过一定程度的复杂性之后将变得非常困难。

    现在,您是否听取 Microsoft 关于在 Model 上使用公共属性而不是公共字段的建议取决于您,但如果您以后需要在 getter 和 setter 中添加一些逻辑,则养成一个好习惯。一开始,自动属性可以很好地替代简单的公共字段,这样您就不必在实际需要一个支持字段之前声明一个支持字段。

    【讨论】:

    • Matthew,谢谢!INotifyPropertyChanged 实现是 ViewModel 的“代码级特征”。具体到我的项目,底层模型的值可以在幕后改变。那么我的 ViewModel 怎么知道呢?我的模型确实没有 ViewModel 可以订阅的 INotifyPropertyChanged(如果它确实有 PropertyChanged 处理程序,它只是不是模型......它是 ViewModel)。我觉得对于这个特定的要求,教科书 MVVM 并没有发生
    • 您可以将模型包装在实现 INPC 的类中。然而,这确实意味着你有大量的样板代码暴露每个属性并触发 propertychanged
    • 通常的设计假设没有其他东西会改变你背后的模型。如果这是可能的,那么模型必须提供一种方法来表明已经发生了变化。有很多方法可以做到这一点,INPC 只是其中之一,但它确实需要一些知道模型实际上已经改变的东西的积极参与。
    【解决方案2】:

    这里还有一件事,Model 是一个 POCO,并且不会有 INotifyPropertyChanged,所以让 VM 知道 模型值是另一个问题

    由于(我假设)模型可以从任何地方更改,您唯一的其他选择是拥有 2 个 INPC - 一个用于 Model-ViewModel,一个用于 ViewModel-View。

    我个人不喜欢这种方法。太多的流程和重构问题(除非你使用反射——这是更多的代码和查找,但高度可维护) 只需尝试使用分部类将模型和视图模型分开物理分离。例如 Employee.cs 和 Employee.ViewModel.cs。并将它们分组 - 看起来更好

    模型需要是可移植的,INPC is fine 带有可移植类库,这样您就可以跨各种目标重用代码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 2011-03-06
      • 1970-01-01
      • 2021-09-15
      • 2020-06-20
      • 1970-01-01
      • 2011-08-24
      相关资源
      最近更新 更多