私は、次のリンクで説明したとおりにINotifyDataErrorInfoを実装している:フォースINotifyDataErrorInfo検証
http://blog.micic.ch/net/easy-mvvm-example-with-inotifypropertychanged-and-inotifydataerrorinfo
私は、モデル内の文字列プロパティにバインドされているTextBox
を持っています。
XAML
<TextBox Text="{Binding FullName,
ValidatesOnNotifyDataErrors=True,
NotifyOnValidationError=True,
UpdateSourceTrigger=PropertyChanged}" />
モデル
private string _fullName;
public string FullName
{
get { return _fullName; }
set
{
// Set raises OnPropertyChanged
Set(ref _fullName, value);
if (string.IsNullOrWhiteSpace(_fullName))
AddError(nameof(FullName), "Name required");
else
RemoveError(nameof(FullName));
}
}
INotifyDataErrorコード
private Dictionary<string, List<string>> _errors = new Dictionary<string, List<string>>();
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
// get errors by property
public IEnumerable GetErrors(string propertyName)
{
if (_errors.ContainsKey(propertyName))
return _errors[propertyName];
return null;
}
public bool HasErrors => _errors.Count > 0;
// object is valid
public bool IsValid => !HasErrors;
public void AddError(string propertyName, string error)
{
// Add error to list
_errors[propertyName] = new List<string>() { error };
NotifyErrorsChanged(propertyName);
}
public void RemoveError(string propertyName)
{
// remove error
if (_errors.ContainsKey(propertyName))
_errors.Remove(propertyName);
NotifyErrorsChanged(propertyName);
}
public void NotifyErrorsChanged(string propertyName)
{
// Notify
if (ErrorsChanged != null)
ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
}
は今、このすべては、Fiを提供して動作しますしかし、それは私のテキストボックスに私が何かを入力するとただちに有効になります。ボタンをクリックするなどして、テキストボックスに触れることなく、オンデマンドで検証する方法がいくつかあります。
this質問に記載されているようにすべてのプロパティに対してPropertyChangedを発生させようとしましたが、エラーは検出されません。私は何とか私の不動産セッターが呼び出される必要があるので、エラーを検出することができます。私はMVVMソリューションを探しています。
なぜNotifyErrorsChangedメソッドを呼び出すだけですか?これにより、ErrorsChangedイベントが発生し、すべてのバインドされたコントロールは、ValidatesOnNotifyDataErrors = Trueの場合、それに反応します。 – Stipo
私はそれを試しました、それは何もしないと、私はその_errors辞書がその時点で空であるためだと仮定しています。 – kskyriacou
オンデマンド検証の目的は何ですか?モデルのプロパティが変更されると、モデルはすぐに検証されます。マニュアル検証は、モデルが既にそれ自身で検証されているため、同じ結果が得られます。 – TreeTree