Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
= new Dictionary<string, List<string>>();Свойство
HasErrorstruepublic bool HasErrors => _errors.Any();Создайте вспомогательный метод для инициирования события
ErrorsChangedPropertyChangedprivate void OnErrorsChanged(string propertyName){ ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));}Как упоминалось ранее, метод
GetErrors()nullpropertyNamenullpublic IEnumerable GetErrors(string propertyName){ if (string.IsNullOrEmpty(propertyName)) { return _errors.Values; } return _errors.ContainsKey(propertyName) ? _errors[propertyName] : null;}Финальный набор вспомогательных методов будет добавлять одну или большее число ошибок для свойства либо очищать все ошибки для свойства (или всех свойств). Не следует забывать о вызове вспомогательного метода
OnErrorsChanged()private void AddError(string propertyName, string error){ AddErrors(propertyName, new List<string> { error });}private void AddErrors( string propertyName, IList<string> errors){ if (errors == null || !errors.Any()) { return; } var changed = false; if (!_errors.ContainsKey(propertyName)) { _errors.Add(propertyName, new List<string>()); changed = true; } foreach (var err in errors) { if (_errors[propertyName].Contains(err)) continue; _errors[propertyName].Add(err); changed = true; } if (changed) { OnErrorsChanged(propertyName); }}protected void ClearErrors(string propertyName = ""){ if (string.IsNullOrEmpty(propertyName)) { _errors.Clear(); } else { _errors.Remove(propertyName); } OnErrorsChanged(propertyName);}Возникает вопрос: когда приведенный выше код активизируется? Механизм привязки прослушивает событие
ErrorsChangedИспользование интерфейса INotifyDataErrorInfo для проверки достоверности
Одним из мест выполнения проверки на предмет ошибок являются блоки
setMakeModelTpublic string Make{ get { return _make; } set { if (value == _make) return; _make = value; if (Make == "ModelT") { AddError(nameof(Make), "Too Old"); } else { ClearErrors(nameof(Make)); } OnPropertyChanged(nameof(Make)); OnPropertyChanged(nameof(Color)); }}Основная проблема такого подхода состоит в том, что вам приходится сочетать логику проверки достоверности с блоками
set