我很难在WPF / MVVM中找到令人满意的数据验证方法。我一直在使用IDataErrorInfo
,但是如果我将文本框绑定到(比方说)int
属性,并输入一个非数字值,WPF会生成自己的验证消息(“value'xyz'不能被转换“)。该控件确实突出显示为错误,但我的viewmodel不知道该属性处于无效状态,因为绑定(因此IDataErrorInfo验证)从未发生过。
我还没有查看自定义验证器。使用这些可以通知视图模型有错误吗?我有点不愿意使用它们,因为为复杂应用程序所需的许多规则创建验证器类似乎过多。也许我可以混合使用这两种方法,即确保输入是数字的基本自定义验证器,以及更复杂的东西的IDataErrorInfo?
我也在努力使用IDataErrorInfo来验证“相关”属性。假设我的模型具有“Min”和“Max”属性,我想确保Min小于Max。如果我将“最小”文本框更改为大于最大值,则控件将被正确标记为无效。如果我现在将“Max”更改为大于“Min”,则“Min”文本框验证状态不会被清除(可能是因为“Min”没有更改,因此不会再次验证)。这种情况的最佳方法是什么?
我很想知道其他人如何处理WPF验证。 .Net 4.5中的WPF验证是否有任何改进?
答案 0 :(得分:1)
怀疑你知道这一点,但如果类型不匹配(或无法转换),甚至不会调用set。
这个问题与一个空的TextBox绑定到一个Int?因为TextBox传递String.Empty不为null。所以使用转换器将String.Empty转换为null。
TextBox将接受文本。没有绕过那个。
你可以绑定到字符串,所以一切都可以到达集合。
或者你可以在UI处理keydown事件,只允许数字并绑定到Int。然后在验证中确定值是否在范围内。