я реализовал INotifyDataErrorInfo точно так, как описано в следующей ссылке:Force 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));
}
Теперь все это работает фи ne, но он проверяется только после того, как I введите что-то в своем текстовом поле. Я бы хотел каким-то образом проверить по требованию, даже не касаясь текстового поля, скажем, нажатием кнопки.
Я попытался повысить PropertyChanged для всех моих свойств, как описано в this вопрос, но он не обнаруживает ошибки. Мне почему-то нужно, чтобы мой настройщик свойств вызывался, чтобы можно было обнаружить ошибки. Я ищу решение MVVM.
Почему бы вам просто не вызвать метод NotifyErrorsChanged? Это вызовет событие ErrorsChanged, и все связанные элементы управления должны реагировать на него, если они имеют ValidatesOnNotifyDataErrors = True. – Stipo
Я пробовал, он ничего не делает, и я предполагаю, что это потому, что словарь _errors пуст в то время. – kskyriacou
Какова цель проверки по требованию? Ваша модель будет проверять себя сразу же после изменения любого из ее свойств. Ручная проверка просто даст тот же результат, потому что модель уже была проверена сама по себе. – TreeTree