複数のフィールド間のバリデーションに問題があります。たとえば、DateViewModelという名前のクラスの2つのインスタンスを含むRangeMapという名前のViewModelがあります。それぞれのインスタンスは開始日と終了日を表します。このような異なるレベルの複数のフィールド間のバリデーション
だから私の結合ルックス -
<TextBox Text="{Binding StartDate.Date, ValidateOnDataError=True}">
<TextBox Text="{Binding EndDate.Date, ValidateOnDataError=True}">
マイRangeDateViewModelクラスがIDataErrorInfoインターフェイスを実装しています。私の計画では 、RangeDateViewModelはこのようなIDataErrorInfo [「プロパティ名」]機能で検証ロジックを適用することで、開始日が終了日より前の日付であることを検証します -
public string this[string columnName]
{
get
{
return ValidationError();
}
}
問題は、これは決してないということですその代わりにそれぞれのDateViewModelクラスにあるIDataErrorInfoプロパティが呼び出されています。
これは、バウンドプロパティがRangeDateViewModelと同じレベルではなく、子のDateViewModel内にあるためです。
私の必要性は非常に基本的であり、この問題のための簡単な解決策がなければならないと思います。 IDataErrorInfoの代わりにValidationRulesを使用しようとしましたが、ViewModelにValidationRulesから現在の検証ステータスを知らせるのに問題がありました。
ありがとうダニエル!私はあなたが示唆したことを試みましたが、明らかにまだ十分ではありません。 IDataErrorInfoプロパティは実際にはアクセスされていますが、テンプレートの初期化時にのみ使用され、実際のデータが変更されたときは後でありません。これは、StartDateとEndDateが複雑なオブジェクトなので、自分自身は変更されていませんが、その内部のプロパティであり、PropertyChangedを呼び出すのに十分なフォームではないからです。たぶん私は何らかの形で内部日付プロパティが変更されたときにイベントを発生させる必要がありますか? – Dror
@Dror:そうです。更新された回答のステップ3を参照してください。 –
もう一度Daniel!これは私が直面している最後のマイナーな問題がまだありますが、うまくいっています。このソリューションでは、値が無効のときに赤でマークされた2つのコントロールが表示されます。私は、赤でマークされているのではなく、これら2つのフィールドを保持しているStackpanelが読み込み中にマークされることを望みます。好ましくは、これらの2つのフィールドはマーキングされませんが、必須ではありません。私は "Validation.HasError"をtrueに設定する "HasErrors"という名前のRangeDateViewModelのboolプロパティにDataTriggerを適用しようとしましたが、残念ながら読み取り専用のプロパティです。この問題についてもお手伝いできることを願っています。 – Dror