WPF中的MVVM和转换错误——结合来自视图的转换异常和来自模型的验证错误



我正在使用Josh Smith在http://msdn.microsoft.com/en-us/magazine/dd419663.aspx的文章中描述的MVVM模式开发一个WPF应用程序。

我想不出一个好的方法来处理反向转换错误(例如,当用户在绑定为double的文本框中输入字母时)。

Josh Smith提出了一个验证系统,其中模型验证它自己的值并通过SomeModel.IsValid呈现布尔结果。Josh然后使用IsValid的值作为某些按钮的谓词,例如表单上的保存按钮-如果表单没有有效地完成,IsValid为false并且保存按钮被禁用。

这个方法非常有效。但是,当用户在无法转换的文本框中键入值时,会发生ConvertBack错误。永远不会调用ViewModel的属性setter,因此永远不会更新Model的属性。IsValid仍然为真。尽管视图通过显示错误消息并突出显示错误(或其他设置)来响应验证错误,但Save按钮仍然保持活动状态,因为模型的IsValid属性仍然为真,因为模型尚未更新。

有MVVM用户遇到过同样的挑战吗?什么好主意吗?

一个建议是模型上的属性可以是Nullable。然后,如果用户输入不可转换的日期(例如绑定到double类型的文本框中的字母),转换器应该将源设置为Null。然而,我找不到一种简单的方法来做到这一点——它似乎需要为我需要功能的每种数据类型和我需要的每种数字格式编写自定义转换器。这是一个非常糟糕的解决方案,看起来像是一个设计挑战。

任何想法?

我找到了两篇关于这个问题的优秀文章:

Karl Shifflett:http://karlshifflett.wordpress.com/mvvm/input-validation-ui-exceptions-model-validation-errors/

Josh Smith:

http://joshsmithonwpf.wordpress.com/2008/11/14/using-a-viewmodel-to-provide-meaningful-validation-error-messages/

这里复制起来有点太复杂了,所以我就把链接标记为答案。

您可能对BookLibrary示例应用程序WPF应用程序框架(WAF)感兴趣。它展示了如何将解析或ConvertBack异常作为验证错误处理。

只要在"Pages"文本框中输入"abc",看看验证错误是如何显示为工具提示和保存按钮被禁用的

最新更新