以下代码段是我的问题的简化版本。基本上我正在尝试捕获在调用updatesource时我的setter中发生的错误并将其传播到我下面显示的catch块。问题是如果在updatesource下面的调用堆栈中发生异常,BindingExpression.UpdateSource()似乎捕获该错误并处理它。我无法得到异常,让它回到我的catch语句中。可以禁用此行为吗?
BindingExpression be = textBox.GetBindingExpression(TextBox.TextProperty);
try
{
be.UpdateSource();
}
catch (Exception ex)
{
MessageBox.Show("ex.Message");
}
/////////////////////////////////////////////// ///////////////////
public string MyValue
{ get {return _value;}
set {
if(value > 10)
throw new Exception("Out of Range");
}
}
答案 0 :(得分:2)
WPF和Silverlight中的绑定可以配置为使用setter中抛出的异常进行验证。我相信Donut对 ValidatesOnExceptions 的评论是问题的核心。其他相关属性(至少在Silverlight中)是 NotifyOnValidationError 。如果您没有使用此功能进行验证,则应该可以将其关闭。如果是,您可以从验证系统中获取它。
修改强> 我做了一个示例项目来检查情况,并且在单步执行时我发现UpdateSource()为了验证系统的目的捕获了异常,并且它似乎没有重新抛出。您可以创建自己的UpdateSource方法(可能作为具有不同名称的扩展方法),以更新绑定中属性的值,但不捕获异常(或捕获和重新抛出)。
答案 1 :(得分:-1)
我知道这是一个非常古老的话题,但是偶然发现了。
本文提供了一种很好的方法来捕获在setter中发生的错误:https://wpf.2000things.com/2017/06/18/1211-catching-exceptions-originating-in-property-accessors/
它的工作方式非常简单和有效:它创建了TraceListener的重写,并在重写的WriteLine()方法内重新引发了异常。 然后,App.OnStartup()将新的侦听器添加到PresentationTraceSources.DataBindingSource.Listeners中,突然之间,可以捕获在setter中抛出的异常。
缺点是,如果您在整个应用程序中遇到任何绑定错误,这些错误将立即被发现,您将开始看到它们。