【发布时间】:2011-10-27 12:29:13
【问题描述】:
如果我有一个 WPF 控件绑定到数据源并在 Binding 对象上将 ValidatesOnExceptions 设置为 true。现在,如果我在控件中写入无法转换为源数据类型的内容,我将收到验证错误并在控件上显示红色边框。
但是如果我在源上设置了不兼容的值,异常会在绑定中静默捕获并返回默认值。由于绑定错误,没有迹象表明控件中的值不可信。
我如何将绑定问题可视化给用户,无论是哪一方造成的?我想让用户知道控件中的值是不可靠的。
更多信息:
这就是我在跟踪中的内容。它告诉我在转换过程中抛出了 OverflowException(因为 99999 不适合 Int16)。然后在目标上设置值时,它只是使用 0 而不是 99999。没关系,我不指望它会做不可能的事情。问题是它没有给我一个选项来处理错误并且没有发现验证错误。
从 DataClass 获得 PropertyChanged 事件 (hash=2616333)
使用 RuntimePropertyInfo(Int32) 从 DataClass (hash=2616333) 获取级别 0 的值:'99999'
TransferValue - 得到原始值“99999”
mscorlib.dll 中出现了“System.OverflowException”类型的第一次机会异常
System.Windows.Data 错误:6:“SystemConvertConverter”转换器无法转换值“99999”(类型“Int32”);如果可用,将使用后备值。绑定表达式:路径=Int32; DataItem='DataClass' (HashCode=2616333);目标元素是'AliasClass' (HashCode=32866918);目标属性是“Int16”(类型“Int16”)OverflowException:“System.OverflowException:对于 Int16,值太大或太小。
TransferValue - 隐式转换器产生 {DependencyProperty.UnsetValue}
TransferValue - 使用后备/默认值“0”
TransferValue - 使用最终值'0'
【问题讨论】:
-
根据 WPF 4 Unleashed 一书,验证仅在将数据从目标推送到源时有效,反之则无效。
标签: wpf validation binding