【问题标题】:MVVM, WPF, and ValidationMVVM、WPF 和验证
【发布时间】:2010-12-06 20:42:44
【问题描述】:

嗯,我认为我对 MVVM 有相当好的了解。但我需要澄清一下。

ViewModel 是否负责调用适当的服务来持久化模型信息?

如果是这样,那么 ViewModel 必须有一个干净的方法来确定它持有的数据是否有效。如果数据有效,它将相应地更新模型。最后,在给定新更新的模型的情况下,调用一个持久化模型的服务。那么问题来了:我们如何验证 ViewModel 的信息,并在 View 中轻松显示?

我见过几种不同的验证方法。有人建议使用 IDataErrorInfo,我认为这绝对令人作呕。

另一个是将 ValidationRule 添加到 Binding.ValidationRules。但是,使用这种方法不能在整个模型的上下文中进行操作。 ValidationRule 对象只能对单个值执行验证。一个例子可能是确保一个值是一个整数或在某个范围内。

我刚开始研究的另一个想法是使用 BindingGroup。但目前我对此知之甚少,因为我仍在阅读它。

我希望能够在一个地方执行验证逻辑以供 View 和 ViewModel 使用。除了这个要求之外,我还希望能够针对 ViewModel 中的任何其他值执行验证。此外,如果 ViewModel 处于无效状态,则能够防止其持久化数据。这需要很容易地反映在视图中。

如果有人可以向我指出一些文章或对我想要的方法提供一些见解,我将非常感激。

【问题讨论】:

  • 出于兴趣,你为什么觉得 IDataErrorInfo 很恶心?
  • 我认为这是对索引器的误用。 ViewModel["Name"] 应该返回一个名称...不为空/“错误!”。您还受限于在视图中绑定的属性。它不适合验证器,例如 ValidateNameInformation,它可能会检查所有涉及的字段。如果我在这些陈述中被误解,请纠正我。
  • 解决索引器滥用的一种方法是使用显式接口实现。这样我就没有一个奇怪的“索引器”乱扔我的 ViewModel 公共界面。我仍在研究如何使用 MVVM 验证多个字段。

标签: c# .net wpf mvvm


【解决方案1】:

我们在业务模型中进行数据验证,并且仅在业务模型允许时才允许保存(因为它具有有效数据),事后看来我们可以在视图模型中完成此操作,但这意味着不同的验证方法每个视图模型。如果您以不同的方式显示相同的数据两次,您可能需要重新编写验证逻辑。

我们对业务层中的几乎每个字段都进行了 isdirty 和 isValid,我们编写了自己的自定义字段对象和一个自定义的外部引用对象来实现这一点。然后我们可以将 staraight 绑定到这些属性,以直观地查看我们是否有效/脏等。然后我们通过视图模型传播这些属性。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 2010-12-25
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多