我正在尝试找出验证用户输入的最佳方法,并且一直在研究ValidationRule和IDataErrorInfo。我有一个VM和一个模型,我想确保用户不会在多个文本框的绑定(bind)双精度(或整数)中输入alpha字符。
我遇到了3个问题
1)当我使用ValidationRule时,该方法返回一个“ValidationResult”,但是它在哪里呢?是否将其存储为属性?
2)如果我使用IDataErrorInfo并输入了一些字母字符,则永远不会调用它(如果输入了数字),这是预期的吗? *
*(我认为也许值转换器可能在这里有所帮助,但我感觉我正在将两个独立的概念混在一起)
3)确实,我想做的是最后在用户单击“保存”并检查所有值时进行验证。因此,按照1838300的使用,也许不需要这两种方法。是正确的,这些真的仅用于“即时”验证吗?
我对第3点的想法是,ValidationRule的结果是否存储在某个地方,我可以检查每个控件的位置或存储位置。或者,如果调用了IDataErrorInfo,则可以为每个控件手动存储一些布尔值并进行检查。
有什么想法或想法吗?
谢谢!
最佳答案
有几件事,您需要知道:
当依赖项属性的类型与基础值不同时,如果不存在valueconverter,则尝试自动转换。
这是普通绑定(bind)引擎的全部。因此,由于您的文本框输入不能很好地转换为带有alpha字符的ints / doubles,因此将引发一个异常并将持续引发异常,直到您更正依赖项属性的值(此处为TextBox的Text属性)为止-现在从未到达基础数据对象。
如果您在文本框中更改文本时在输出窗口中查找异常,则可以验证此行为。请参阅本文,以了解如何正确实现Validation和IDataErrorInfo:link。