2012-11-28 23 views
7

IDataErrorInfoをViewModelで使用して入力を検証するWPFアプリケーション(.Net 3.5)があります。IDataErrorInfo:すべてのプロパティが有効かどうかを確認する方法?

素晴らしいですが、usercontrolは正しいUIフィードバックを取得します。

問題は、ユーザーが選択した要素を変更したり、この要素を保存したりできることです。

私の質問は:どのように私のすべてのプロパティが有効であることを知ることができますか?少なくとも、表示された値はすべて有効です。目標は、この結果にIsActiveをバインドすることです。

+0

エラープロパティがnullまたは空でない場合エラーが発生します –

+0

どこが妥当なのかを知りたいですか?ビューまたはViewModelで – Blachshma

+0

私はこれの答えがあなたを助けるかもしれないと思います:http://stackoverflow.com/questions/104520/wpf-validation-for-the-whole-form –

答えて

15

....あなたの財産変更された場合に、その後

#region IDataErrorInfo Members 

public string Error 
{ 
    get { return this[null] } 
} 

public string this[string columnName] 
{ 
    get 
    { 
     StringBuilder result = new StringBuilder(); 
     if (string.IsNullOrEmpty(columnName) || columnName == "FirstName") 
     { 
      if (string.IsNullOrEmpty(FirstName)) 
       result.Append("Please enter a First Name\n"); 
     } 
     if (string.IsNullOrEmpty(columnName) || columnName == "LastName") 
     { 
      if (string.IsNullOrEmpty(LastName)) 
       result.Append("Please enter a Last Name\n"); 
     } 
     if (string.IsNullOrEmpty(columnName) || columnName == "Age") 
     { 
      if (Age < = 0 || Age >= 99) 
       result.Append("Please enter a valid age\n"); 
     } 
     return (result.Length==0) ? null : result.Remove(result.Length-1,1).ToString(); 
    } 
} 

#endregion 


public bool IsValid { 
    get { return string.IsNullOrEmpty(this.Error); } 
} 

if (e.PropertyName == "Error") { 
    OnPropertyChanged(this,new PropertyChangedEventArgs("IsValid")); 
} 
if (e.PropertyName != "Error" && e.PropertyName != "IsValid") { 
    OnPropertyChanged(this,new PropertyChangedEventArgs("Error")); 
} 
+0

ああ、これがエラーの理由です私は理解していませんでした。これは実装されていませんでした。これは実装されていないことを理解していませんでした – J4N

+1

@ J4Nはい、エラーは、オブジェクト自体に何が問題であるかをまとめたものです。 –

+0

あなたのソリューションを使用するように自分のコードを修正しました(ほとんど、私はブール値を含むIsValidプロパティを持っていますが、私はイベントの変更要素でそれを更新します) – J4N

0

今のところ私のモデルにこのメソッドを追加しました。

public Boolean IsModelValid() 
    { 
     Boolean isValid = true; 
     PropertyInfo[] properties = GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 

     foreach (PropertyInfo p in properties) 
     { 
      if (!p.CanWrite || !p.CanRead) 
      { 
       continue; 
      } 
      if (this[p.Name] != null) 
      { 
       isValid = false; 
      } 
     } 
     return isValid; 
    } 

それが変化したとき、私は、私は、このメソッドを呼び出し、その結果は私の実際のパブリックメンバーと異なる場合、私はそれを更新し、PropertyChangedイベントに

public MyClassName() 
    { 
     PropertyChanged += CheckModelValidity; 
     CheckModelValidity(null, null); 
    } 

をオブジェクト自体をバインド:

private void CheckModelValidity(object sender, PropertyChangedEventArgs e) 
    { 
     bool isModelValid = IsModelValid(); 
     if(isModelValid!= IsValid) 
     { 
      IsValid = isModelValid; 
     } 
    } 

次に、IsValidプロパティをバインドできます。

もっと良い解決策があるのでしょうか?このスタイルにあなたの実装を変更IDataErrorInfoの実装上のあなたのコメントから

+5

不快、プロパティ変更イベントが発生するたびにリフレクションを使用.... –

+2

このルートを下る場合は、静的コンストラクターで有効なプロパティー名のリストを初期化し、リストを静的フィールドに保管してください。その後、一度だけ反射が起こる –

+0

@BobValeええ、私はそれも誇りではありませんが、私は誰かが1つのチェックを忘れる危険にこれを好む。ニース、私は静的なvarでこれを初期化します。 – J4N

関連する問題