2012-03-12 19 views
0

コードビハインドからの検証の実行が発生しました。私のデータは、データグリッドに表示されます。列の1つ(タイプ)がドロップダウンであり、ドロップダウンメニューが変更されたときに、ドロップダウンクローズイベントがトリガーされ、コード内で処理されます。INotifyDataErrorInfoコードの後ろに昇格エラーがありません

私が達成しようとしているのは、ドロップダウンで新しく選択したタイプと一致するように、次の列の内容を検証することです。一致しない場合は、グリッドに表示される検証エラーが欲しいです。 INotifyDataErrorInfoインターフェイスを使用して検証を実装しました。コード内で使用する場合を除いて、実際にはうまく動作します。コードビハインドが検証を呼び出すと、DataGridのValidationSummaryは決して更新されません。私はここで間違っているのですか?デバッガを使用している場合、私ははっきりとインターフェースのdictionnaryエラーに追加されたエラーを表示することができます...ここで

はハンドラである:

 private void TypeBoxChanged(object sender, EventArgs e) 
     { 
     ComboBox box = (sender as ComboBox); 
     IncomingPolicy row = (IncomingPolicy)box.DataContext; 

     string ruleTypeValue = TypeList.GetKeyForText(box.SelectedItem.ToString()); 
     //check if the type is the same 
     if(row.TypeWrapper == ruleTypeValue) 
      return; 
     if (row.ValidateRule(ruleTypeValue)) 
     { 
      //SAVE the record 
     } 
     else 
     { 
      row.RaiseErrorsChanged("RuleWrapper"); 
     } 
    } 

検証ルール方式はruletypevalue呼び出しでこのメソッドをベースとします

 public bool ValidateRegularExpression(string property, string value, string expression, string errorMessage) 
     { 
     bool isValid = true; 
     Regex regex = new Regex(expression); 
     Match match = regex.Match(value); 
     if (match.Success) 
     { 
      RemoveError(property, errorMessage);     
     } 
     else 
     { 
      AddError(property, errorMessage, false); 
      isValid = false; 
     } 

     return isValid; 
    } 

私はいくつかの時間以前の私は、検証時間を実装しましたMSDN http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifydataerrorinfo%28VS.95%29.aspx

+1

検証が成功したかどうかにかかわらず、常にRemoveErrorを呼び出すべきだと思います。またはメソッドの最後に 'RaiseErrorsChanged(property)'の呼び出しを追加するだけです。 – vorrtex

+0

また、ValidationSummaryコントロール(赤い枠線ではない)でのみ問題が発生した場合、検証されるはずのバインディングに 'NotifyOnValidationError = True'を追加してみてください。 – vorrtex

+0

@vorrtexあなたが答えを出したら、私はRaiseErrorChangedを見つけられませんでした。 thx – Stainedart

答えて

3

上のサンプル実装を追いました

http://vortexwolf.wordpress.com/2011/10/01/wpf-validation-with-idataerrorinfo/

Source code

主な実装はここにある:

this.PropertyChanged += (s, e) => 
{ 
    // if the changed property is one of the properties which require validation 
    if (this._validator.PropertyNames.Contains(e.PropertyName)) 
    { 
     this._validator.ValidateProperty(e.PropertyName); 
     OnErrorsChanged(e.PropertyName); 
    } 
} 

あなたは常にOnErrorsChanged(またはRaiseErrorsChanged中を呼び出す必要がありelpersは、両方のインターフェイスIDataErrorInfoINotifyDataErrorInfoのためのサンプル溶液を作成しましたあなたのケース)メソッドは、検証の成功とは無関係に:プロパティが無効な場合 - 赤の境界線はdiスプレイされていれば有効です。バインドされたコントロールは通常の状態に戻ります。

+0

あなたのコードを試しています。 MVVMで実装しようとしています。それがうまく動作することを望みます。始めてくれてありがとう。 –

関連する問題