BindingExpression.UpdateSource吞下异常

时间:2011-08-10 21:06:39

标签: c# wpf binding binding-expressions

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

2 个答案:

答案 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中抛出的异常。

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