2

次のコードスニペットは、私の問題の簡略版です。基本的に、updatesourceが呼び出されたときにセッターで発生するエラーをキャッチし、それを以下に示すキャッチブロックまで伝播しようとしています。問題は、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"); 
      }
}
4

2 に答える 2

2

WPFおよびSilverlightでのバインディングは、検証のためにセッターでスローされた例外を使用するように構成できます。ValidatesOnExceptionsに関するドーナツのコメントが問題の中心にあると思います。他の関連する属性(少なくともSilverlightでは)はNotifyOnValidationErrorです。この機能を検証に使用していない場合は、オフにできるはずです。もしそうなら、あなたは検証システムからそれを得ることができるかもしれません。

編集: 状況を確認するためにサンプルプロジェクトを作成しましたが、ステップスルーしているときに、UpdateSource()が検証システムの目的で例外をキャッチし、再スローされないようです。バインディング内のプロパティの値を更新するが、例外をキャッチしない(またはキャッチして再スローする)独自のUpdateSourceメソッドを(おそらく別の名前の拡張メソッドとして)作成できます。

于 2011-08-10T21:18:26.217 に答える
-1

私はこれが本当に古いトピックであることを知っていますが、それを偶然見つけました。

この記事は、セッター内で発生するエラーをキャッチするための非常に優れた方法を提供します:https ://wpf.2000things.com/2017/06/18/1211-catching-exceptions-originating-in-property-accessors/

仕組みは非常にシンプルで効果的です。TraceListenerのオーバーライドを作成し、オーバーライドされたWriteLine()メソッド内で例外を再スローします。次に、App.OnStartup()は、新しいリスナーをPresentationTraceSources.DataBindingSource.Listenersに追加します。突然、セッター内でスローされた例外をキャッチできます。

欠点は、アプリケーション全体でバインディングエラーが発生した場合、それらがすぐに検出され、表示されるようになることです。

于 2019-05-23T10:43:51.570 に答える