我在MSDN上关注这个例子 Handle errors and exceptions that occur with databinding(same example also here)
这个例子背后的想法:
BindingSource
和Binding
对象将TextBox控件绑定到业务对象属性。业务对象是Model。BindingComplete
事件。如果有异常,则会被捕获,并且BindingCompleteEventArgs
可以获得异常消息。验证错误消息可以通过这种方式回流到表示层。到目前为止 - 非常好。
这是奇怪的部分。对于不同版本的.NET,捕获业务对象抛出的异常会有所不同。
BindingComplete
事件被触发。事件参数表明绑定不成功。正如所料。 从微软的例子中复制相同的源代码。我只更改项目属性中的.NET版本。
此早期帖子中也提出了类似的方法:Data Binding and throwing exception in setter (2009)
thread on MSDN forum (2010)建议在Binding.Parse
事件中抛出异常
[奇怪的是,即使在Control.Validating事件处理程序中将e.Cancel
设置为true
,也会发生数据绑定。这是一个功能吗?]
使用例外进行用户输入验证并不是很好。
我同意。同时,如果参数是垃圾,模型中的属性设置器必须验证参数并抛出异常。不能有一个接受无效参数的模型。
话虽如此,我也对其他想法持开放态度。模型是否有其他方式进行输入验证并将验证错误信息发送到演示文稿?
这个例子是WinForms。你为什么不使用WPF?
由于遗留问题,我正在使用WinForms。
答案 0 :(得分:1)
这似乎与.Net 3.5和.Net 4+中被归类为用户未处理的异常的内容不同。 .Net 4.0可能不会发生这种变化,因为.Net 4.5+是.Net 4的就地替代品。
请考虑主题代码的属性设置器中引发的System.Exception
的以下配置。从VS2013捕获以下图像。 VS2015 +使用不同的异常设置对话框(请参阅:The New Exception Settings Window in Visual Studio 2015)。要查看用户未处理的选项,您需要启用" Just-My-Code"调试。
当针对.Net 4.7进行编译时,调试器将在抛出异常时中断。但是,当针对.Net 3.5进行编译时,调试器在抛出异常时不会中断。
如果你清除"中断此异常类型是用户未处理的"在框中,您将获得与3.5相同的行为。如果在没有附加调试器的情况下运行,则无论.Net版本如何,行为都是相同的。