【问题标题】:Approaches to WPF binding validation?WPF 绑定验证的方法?
【发布时间】:2012-08-21 14:13:04
【问题描述】:

我正在努力寻找一种令人满意的 WPF/MVVM 数据验证方法。我一直在使用IDataErrorInfo,但如果我将一个文本框绑定到(比如说)int 属性,并输入一个非数字值,WPF 会生成自己的验证消息(“无法转换值'xyz'”) .该控件确实被突出显示为错误,但我的视图模型不知道该属性处于无效状态,因为绑定(以及因此 IDataErrorInfo 验证)从未发生过。

我还没有研究自定义验证器。使用这些是否可以通知视图模型有错误?我有点不愿意使用它们,因为为复杂应用程序所需的许多规则中的每一个创建验证器类似乎有点过分。也许我可以混合使用这两种方法,即确保输入是数字的基本自定义验证器,以及用于更复杂内容的 IDataErrorInfo?

我还在努力使用 IDataErrorInfo 验证“相关”属性。假设我的模型具有“Min”和“Max”属性,我想确保 Min 小于 Max。如果我将“Min”文本框更改为大于 Max,则该控件将被正确标记为无效。如果我现在将“Max”更改为大于“Min”,则“Min”文本框验证状态不会被清除(可能是因为“Min”没有改变,因此不会再次得到验证)。这种情况的最佳方法是什么?

我很想知道其他人是如何处理 WPF 验证的。 .Net 4.5 中的 WPF 验证是否有任何改进?

【问题讨论】:

  • 你看过 ValidationRules 和 BindingGroups 吗? shujaat.net/2010/07/wpf-validation-using-validation-rules.html ...该博客中还有很多其他帖子与验证有关。
  • 我之前遇到过验证两个相关属性的问题,有我的问答here
  • 当我在问题中提到“自定义验证器”时,我指的是 ValidationRules - 如果不清楚,请道歉。
  • 接受 Blam 的响应作为使用字符串属性的答案似乎是我发现解决绑定期间数据转换失败问题的唯一方法。

标签: wpf


【解决方案1】:

怀疑你知道这一点,但如果类型不匹配(或无法转换),set 甚至不会被调用。

绑定到 Int 的空 TextBox 是否存在此问题?因为 TextBox 正在传递 String.Empty 而不是 null。所以使用转换器将 String.Empty 转换为 null。

一个 TextBox 将接受文本。没有办法解决这个问题。

您可以绑定到字符串,以便所有内容都通过集合。

或者您可以在 UI 上处理 keydown 事件,并且只允许数字并绑定到 Int。然后在验证中确定该值是否在范围内。

【讨论】:

  • 那我会有一个姐姐 Int 吗?得到;读取字符串并由工作代码使用。
猜你喜欢
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多