【发布时间】:2018-09-05 02:12:46
【问题描述】:
我正在关注 MSDN 中的这个示例
Handle errors and exceptions that occur with databinding (same example also here)
这个例子背后的想法:
- TextBox 控件使用
BindingSource和Binding对象绑定到业务对象属性。业务对象是模型。 - 业务对象中的属性设置器验证输入并在输入无效时引发异常。
- 绑定对象配置为捕获此类异常。
- 绑定触发
BindingComplete事件。如果有异常,就会被捕获,异常消息可通过BindingCompleteEventArgs获得。验证错误消息可以通过这种方式回传到表示层。
到目前为止 - 非常好。
这是奇怪的部分。业务对象抛出的异常的捕获因 .NET 的不同版本而异。
- 这适用于 .NET 版本 3.5 。绑定框架捕获异常。
BindingComplete事件被触发。事件参数表明绑定不成功。正如预期的那样。 - .NET 版本 4.0、4.5、4.5.2 不会在模型的属性设置器中捕获异常。执行因该异常而中断。
从 Microsoft 的示例中复制粘贴相同的源代码。我只在项目属性中更改 .NET 的版本。
- 在较新版本的 .NET 中发生了什么变化,导致此示例停止按预期工作?
- 有没有办法让它与较新版本的 .NET 一起工作?该示例是否缺少在较新版本的 .NET 中引入的设置?
附录 A:相关阅读和现有技术
在较早的帖子中也提出了类似的方法:Data Binding and throwing exception in setter (2009)
thread on MSDN forum (2010) 建议在 Binding.Parse 事件中引发异常。
[奇怪的是,即使在 Control.Validating 事件处理程序中将e.Cancel 设置为true,也会发生数据绑定。这是一个功能吗?]
附录 B:对预期 cmets 的抢先响应
使用异常进行用户输入验证并不是很好。
我同意。同时,模型中的属性设置器必须验证参数并在参数为垃圾时抛出异常。不能有一个接受无效参数的模型。
话虽如此,我也对其他想法持开放态度。模型是否有其他方法可以进行输入验证并将验证错误信息发送到演示文稿?
那个例子是 WinForms。你为什么不使用WPF?
由于遗留问题,我正在使用 WinForms。
【问题讨论】:
-
“.NET 版本 4.0、4.5、4.5.2 没有在模型的属性设置器中捕获异常。” - 我认为您的意思是:“.NET 版本 4.0、4.5、4.5.2 在模型的属性设置器中捕获异常。”也就是说,它似乎是附加了调试器的未处理异常处理的变化。如果您清除“当此异常类型为用户未处理时中断”框,您将获得与 3.5 相同的行为。如果您在没有附加调试器的情况下运行,则行为与 .Net 版本无关。
标签: .net winforms validation data-binding exception-handling