我正在使用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仍然是真的。虽然View通过显示错误消息并突出显示错误(或任何设置可能)来响应验证错误,但“保存”按钮仍然处于活动状态,因为模型的IsValid属性仍然为真,因为模型尚未更新
是否有任何MVVM用户遇到过同样的挑战?有什么想法吗?
一个建议是模型上的属性可以为Nullable。如果用户输入不可转换日期(例如文本框中绑定到double的字母),则Converter应将源设置为Null。但是,我找不到一种简单的方法 - 它似乎需要为我需要的每种数据类型编写自定义转换器,以及我需要的每种数字格式。这是一个非常糟糕的解决方案一个设计挑战。
有什么想法吗?
答案 0 :(得分:1)
我找到了两篇解决这个问题的优秀文章:
Karl Shifflett的一个人: http://karlshifflett.wordpress.com/mvvm/input-validation-ui-exceptions-model-validation-errors/
Josh Smith的一个人:
这里复制有点过于复杂,所以我只是将链接标记为答案。
答案 1 :(得分:1)
您可能对 WPF Application Framework (WAF) 的 BookLibrary 示例应用感兴趣。它显示了如何将Parsing或ConvertBack异常作为验证错误处理。
只需在“页面”文本框中输入“abc”,即可查看验证错误如何显示为工具提示,并且“保存”按钮已禁用。