locked
LostFocus時のエラー検証について RRS feed

  • 質問

  • 損と申します。
    VS2010+Blend4+Silverlight4で開発しております。

    INotifyDataErrorInfoによるエラー検証処理の実装で、値が変更されない時にエラー検証が行えないため困っております。

    やりたいこととしては、
    1.初期画面ではTextBox.Textは空文字(このTextBoxは必須入力としたい)
    2.初期画面ではエラーは表示しない
    3.TextBoxにフォーカスを当てて、フォーカスを失ったらエラーを表示する
    としたいです。

    しかし、TextBox.Textの内容が空文字のまま変化しないと、Setterが呼ばれないため、エラー検証処理も走らず、行き詰っております。
    LostFocusの中で以下のような処理をしたところ、見かけ上は目的の動作となりました。

      protected override void OnLostFocus(RoutedEventArgs e)
      {
       string temp = this.Text;
       
       this.SetValue(TextBox.TextProperty, temp + "_"); // 関係ない値を入れて無理やりSetterを動かす
       this.SetValue(TextBox.TextProperty, temp);   // 値を書き戻す

       base.OnLostFocus(e);
      }

    しかし、これではSetterが2回呼ばれてしまい、バグの温床となりそうです。
    スマートな実装方法は無いでしょうか。

    2011年3月17日 1:53

回答

  • 自己解決しました。
    LostFocusのタイミングで、BindingExpressionのUpdateSource()を呼ぶことで、現在の値の検証を行うようにしました。

      protected override void OnLostFocus(RoutedEventArgs e)
      {
       base.OnLostFocus(e);

       this.GetBindingExpression(TextBox.TextProperty).UpdateSource();
      }

    TextBox.TextProperty以外にもUpdateSource()しないといけないものがあるような気がしますが、今回の要件はこれで満たせるため、解決とさせて頂きます。

     

    • 回答としてマーク 2011年3月23日 5:10
    2011年3月23日 5:10