Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Причина в том, что индексатор выполняется, только когда для свойства сгенерировано событие
PropertyChangedPropertyChangedClickUpdateSourceTriggerPropertyChangedMakeРешить проблему можно двумя путями. Первый предусматривает изменение объекта
PropertyChangedEventArgsstring.EmptyOnPropertyChanged()protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = ""){ if (propertyName != nameof(IsChanged)) { IsChanged = true; } //PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(string.Empty));}Теперь при выполнении того же самого теста текстовые поля Make и Color декорируются с помощью шаблона отображения ошибки, когда одно из них обновляется. Так почему бы ни генерировать событие всегда в такой манере? В значительной степени причиной является производительность. Вполне возможно, что обновление каждого свойства объекта приведет к снижению производительности. Разумеется, без тестирования об этом утверждать нельзя, и конкретные ситуации могут (и вероятно будут) варьироваться.
Другое решение предполагает генерацию события
PropertyChangedMakeColorИнтерфейс INotifyDataErrorInfo
Интерфейс
INotifyDataErrorInfoIDataErrorInfoValidatesOnNotifyDataErrorstrueИнтерфейс
INotifyDataErrorInfoINotifyDataErrorInfopublic interface INotifyDataErrorInfo{ bool HasErrors { get; } event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged; IEnumerable GetErrors(string propertyName);}Свойство
HasErrorsGetErrors()nullpropertyNamepropertyNameErrorsChangedPropertyChangedCollectionChangedРеализация поддерживающего кода
При реализации
INotifyDataErrorInfoIDataErrorInfoINotifyDataErrorInfoCarPartial.csIDataErrorInfopublic partial class Car: INotifyDataErrorInfo, IDataErrorInfo{...public IEnumerable GetErrors(string propertyName){ throw new NotImplementedException();}public bool HasErrors { get; }public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;}Добавьте закрытое поле типа
Dictionary<string,List<string>>usingSystem.Collections.Genericusing System.Collections.Generic;private readonly Dictionary<string,List<string>> _errors