ValidationViewModelBase を更新しました。
主な変更点は次のとおりです。
- データ検証を行う条件を設定する属性 ValidateConditionalAttribute を追加
いま作っているプログラムで、条件によってデータ検証のオン/オフを行いたかったので機能追加したものです。属性を利用するアイデアは、以前に見た しばやんさんのブログ記事「ASP.NET MVC で条件付きの検証を行う属性とモデルバインダを実装してみた」が記憶に残っていたので利用させていただきました(ASP.NET MVC と WPF は利用環境が異なるので、属性を利用するというアイデアだけですが )。
やっている内容は、しばやんさんのものと同じく、データ検証自体は行い、データ検証を行う条件が偽となる場合に当該プロパティの検証エラーをすべて削除するというものになっています。
また、今回データ検証周りの見直しも行った結果、条件付きのデータ検証の利用コードは次のようになります。
//
private bool _isChecked;
public bool IsChecked
{
get { return _isChecked; }
set
{
_isChecked = value;
base.RaisePropertyChanged(() => IsChecked);
Num = Num;
}
}
private string _num;
// 検証条件を設定する際には、当該検証条件対象のプロパティの set アクセサ中で
// 当該プロパティの set アクセサがに制御が渡るようにするとともに、
// 当該プロパティの set アクセサ中では先頭で RemoveItemValidationError メソッド、
// 最後に RaisePropertyChangedWithoutRemoveItemValidationError メソッドを記述する
[ValidateConditional("IsChecked", true)]
[Required(ErrorMessage = "必須項目です。")]
[Range(0, 100, ErrorMessage = "0 から 100 までの数字を入力してください。")]
public string Num
{
get { return _num; }
set
{
base.RemoveItemValidationError(() => Num);
_num = value;
if (_num == "1")
{
base.ViewModelState.AddError("Num", "1 は禁止です。");
}
base.RaisePropertyChanged(() => Num);
}
}
IsChecked プロパティが真のときに Num プロパティのデータ検証結果が表示されます。
個別のデータ検証の例を入れるために、「1 はダメ」という検証も行っています(内容に意味はありません 😉 )
ValidationViewModelBase を利用したプログラムソースも ZIP ファイルに同梱しているので、興味のある方は参考にどうぞ。