我已经按照以下链接中描述的方式准确实现了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));
}
现在一切都运作良好,但只有在我在文本框中输入内容时才进行验证。我希望有一种方法可以按需验证,而无需触摸文本框,例如在点击按钮时进行验证。
我已经尝试了为我的所有属性引发 PropertyChanged 的方法,如此问题所述,但它无法检测到错误。我需要某种方式来调用属性 setter 以便可以检测到错误。我正在寻找一个MVVM解决方案。
ValidateFullName()
),然后您就可以通过对该方法的简单调用重新验证该值 - 它将重新评估FullName
的当前值是否有效,设置适当的验证信息并在必要时引发ErrorsChanged
。 - Grx70