2011-01-13 10 views
4

プロパティにMinCartValueとMaxCartValueの2つのコントロールがバインドされています。 MinCartValueはMaxCartValueより小さくなければなりません。この検証を行うために、私はIDataErrorInfoインターフェイスを実装し、MinCartValueまたはMaxCartValueのいずれかを押した場合、この[columnName]メソッドで上記のチェックを実行します。 ValidatesOnDataErrors = Trueが両方のコントロールのバインドで設定されます。 検証は正しく機能し、プロパティ値の変更がルールに違反したときに各コントロールを強調表示します。問題は、コントロールが無効であるとフラグが設定されると、ユーザーが他のコントロールの値を変更して問題を修正すると、最初のコントロールは無効としてフラグが付けられたままになります。これは、IDataErrorInfoメソッドが最初のコントロールのプロパティで検証を行っていないために理解できます。S/L 4&IDataErrorInfo - コントロールの再検証を強制する方法(関連するコントロールに触れたとき)

私が必要とするのは、プロパティ#2の検証時にプロパティ#1の再検証(または無効な状態をクリアする)を強制する方法です。逆も同様です。私はこの[columnName]メソッド内でRaisePropertyChangedを呼び出そうとしましたが、何もしません。また、それ自体を検証するためにそれを騙そうとするためにプロパティを独自の値に設定しようとしましたが、何も起こりません。

おかげ

答えて

2

私は(Silverlightの4で導入)INotifyDataErrorInfoインターフェースを見てお勧めします。非同期でプロパティが無効になった場合に通知することができるので、現在変更されているプロパティのみが妥当性が変更されている可能性があると予想するのではなく、多くのプロパティでこれを尊重する方がフレームワークが優れていると思います。

+0

OKこれを見ていきます。 – Laurence

+0

なぜWPFでは 'INotifyDataErrorInfo'がなぜですか?そのような便利なインターフェイス! –

0

あなたの問題を正確に理解しているかどうかは不明ですが、おそらくこれが役立つかもしれません。いくつかの例としてXAMLとバインディングプロパティコードを提供すると役立ちます。

デフォルトのUpdateSourceTrigger(テキストボックスコントロールの場合はフォーカス/非フォーカス)に応じて、コードの問題のようです。 XAMLでUpdateSourceTrigger属性を設定するには、検証が行われるバインドにUpdateSourceTrigger = Explicitを追加します。次に、各TextBox(MinCartValue、MaxCartValue)で、TextChangedイベントにイベントハンドラを追加します。コードビハインドイベントハンドラ内で

、あなたはこのような何かを行うことができます。この場合は

private void TextBox_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     TheTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 
    } 

TheTextBoxは、あなたのカートコントロールのいずれかになります。 UpdateSource()メソッドは、バインディング値を手動で更新する方法です。これにより、検証がトリガーされます。このメソッドは、値を更新するトリガーと結びつけて、既定のスコープの外で変更されたプロパティを変更します(この例では、テキストはフォーカスの代わりに変更され、TextBoxではフォーカスが外されます)。

+0

ありがとうございます。私はMVVMアプローチを使用していると言わざるを得ないが、「コードビハインド」にはXAMLコントロールへの参照がない。私はこれにこだわりたいので、データコンテキストとして機能するオブジェクトのプロパティを参照するだけでそれを行う方法を探しています。 – Laurence

+0

ええMVVMを使用しているかどうかはわかりませんでした。私はMVVMを自分自身に従わせようとしますが、残念ながら、この問題に対する優れたMVVMソリューションはまだありません。 – avanek

0

私はそれをどのように解決したのですか。 Property1とProperty2が共依存であるとしましょう。私はMVVM(まだ)に精通していませんが、おそらくIDataErrorInfoを実装するためにエンティティクラスを拡張しています。この場合、あなたはまた、[プロパティ]変更方法で拡張し、共依存特性の変化を報告することができます。この場合

partial class YourEntity : IDataErrorInfo 
{ 
    public string this[string columnName] 
     { 
      //Your validation logic 
     } 

    public string Error 
    { 
     //WPF doesn't use it anyway 
     get { return string.Empty; } 
    } 

    partial void OnProperty1Changed() 
    { 
     OnPropertyChanging("Property2"); 
     OnPropertyChanged("Property2"); 
    } 

    partial void OnProperty2Changed() 
    { 
     OnPropertyChanging("Property1"); 
     OnPropertyChanged("Property1"); 
    } 
} 

をこのプロパティの1のいずれかでの更新は、連結コントロールの両方が自分自身を再評価になります。

EDIT2:ReportPropertyChang *ではなくOnPropertyChang *を使用する必要があります。 ReportPropertyChangedは、モデルに保留中の変更があることをエンティティ・フレームワークに通知しますが、実際には、ビューに通知するだけです。実際には変更されていないプロパティでデータベースを更新する必要はありません。 ReportPropertyChang *は、データベースにマッピングがない計算フィールドでも失敗します。 EDIT1:ReportPropertyChangingの前にReportPropertyChangingを呼び出すことが必須であることを知りました。

+0

ありがとうございますが、私のプロジェクトではReportPropertyChangedを使用できません。 Entity Frameworkの一部ですか? – Laurence

+0

はい、EntityObjectの保護されたメソッドです。私は最初にあなたのクエストがSilverlightに関するものであることに気付かなかった。私はWPFと連携していますが、SLとどのように関連しているのかわかりません。 – Andikki

1

私は2つのDateTimeプロパティ(DateFromとDateTo)を互いに照合する必要がありました。これらのプロパティの設定では、DateToとDateFromのPropertyChangedイベントが発生しました。魅力のように働いた。

+0

素敵な簡単な答え! – Laurence

関連する問題