2009-03-13 4 views
6

IDataErrorInfoを実装するLinq to EntitiesクラスのプロパティにバインドされたWPFアプリケーションのテキストボックスがあります。テキストボックスバインディングは、ValidatesOnExceptions = TrueとValidatesOnDataErrors = Trueを持ちます。テキストボックスが整数プロパティにバインドされ、ユーザーがテキストを入力すると、カスタムスタイルを設定していないので、テキストボックスのアウトラインが赤色で表示されます。WPFバインディング - オブジェクトを判別する方法は無効です。保存するのを防ぐには

私の保存メソッドでは、オブジェクトが無効なので保存できないことをどのように知ることができますか?ユーザーが保存ボタンをクリックすることをお勧めします。保存ボタンを無効にするのではなく、問題を通知できます。

乾杯、

デイブ

答えて

5

は、私はそれを行うための簡単な方法を発見していません。トラップの周りにいくつかのコードがあり、フォーム上のすべてのコントロールを再帰的に調べ、検証エラーがあるかどうかを判断します。私は、拡張メソッドにそれを回すことになった:

// Validate all dependency objects in a window 
internal static IList<ValidationError> GetErrors(this DependencyObject node) 
{ 
    // Check if dependency object was passed 
    if (node != null) 
    { 
     // Check if dependency object is valid. 
     // NOTE: Validation.GetHasError works for controls that have validation rules attached 
     bool isValid = !Validation.GetHasError(node); 
     if (!isValid) 
     { 
      // If the dependency object is invalid, and it can receive the focus, 
      // set the focus 
      if (node is IInputElement) Keyboard.Focus((IInputElement)node); 
      return Validation.GetErrors(node); 
     } 
    } 

    // If this dependency object is valid, check all child dependency objects 
    foreach (object subnode in LogicalTreeHelper.GetChildren(node)) 
    { 
     if (subnode is DependencyObject) 
     { 
      // If a child dependency object is invalid, return false immediately, 
      // otherwise keep checking 
      var errors = GetErrors((DependencyObject)subnode); 
      if (errors.Count > 0) return errors; 
     } 
    } 

    // All dependency objects are valid 
    return new ValidationError[0]; 
} 

それでは、ユーザーがフォーム上の[保存]ボタンをクリックしたときに、私はこれを行う:

var errors = this.GetErrors(); 
if (errors.Count > 0) 
{ 
    MessageBox.Show(errors[0].ErrorContent.ToString()); 
    return; 
} 

それはそれがあるべきよりも多くの仕事です拡張メソッドを使用すると、それが少し単純化されます。

+0

これは良い解決策です。ありがとうございました。 – Jirapong

3

BindingNotifyOnValidationErrortrueを設定し、親要素のErrorイベントのハンドラを追加できます。イベントは、エラーが追加または削除されるたびに発生します。

+0

素晴らしいアイデア!私は私のコードに適用すると私のソリューションを投稿します! –

関連する問題