【发布时间】: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 验证多个字段。