BindingExpression.UpdateSource吞噬异常

本文关键字:异常 吞噬 UpdateSource BindingExpression | 更新日期: 2023-09-27 18:05:15

下面的代码片段是我的问题的简化版本。基本上,我试图捕获在调用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"); 
      }
}

BindingExpression.UpdateSource吞噬异常

WPF和Silverlight中的绑定可以配置为使用setter中抛出的异常进行验证。我相信Donut关于ValidatesOnExceptions的评论是问题的核心。另一个相关属性(至少在Silverlight中)是NotifyOnValidationError。如果您不使用此功能进行验证,则应该能够将其关闭。如果您是,您可能能够从验证系统中获得它。

编辑:

我制作了一个示例项目来检查这种情况,在逐步进行过程中,我发现UpdateSource()捕获了用于验证系统的异常,并且似乎没有重新抛出。您可以创建自己的UpdateSource方法(可能作为具有不同名称的扩展方法),该方法更新绑定中的属性值,但不捕获异常(或捕获并重新抛出)。

我知道这是一个非常古老的话题,但我只是偶然发现了它。

本文提供了一种非常好的方法来捕获setter内部发生的错误:https://wpf.2000things.com/2017/06/18/1211-catching-exceptions-originating-in-property-accessors/

它的工作原理非常简单和有效:它创建TraceListener的重写,并在重写的WriteLine()方法中重新抛出异常。然后,App.OnStartup()将新的Listener添加到presentationtracesource . databindingsource . listeners中,突然之间,setter中抛出的异常就可以被捕获了。

缺点是如果您在整个应用程序中出现任何绑定错误,这些错误将立即被捕获,并且您将开始看到它们。