Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
Причина в том, что индексатор выполняется, только когда для свойства сгенерировано событие
PropertyChanged
PropertyChanged
Click
UpdateSourceTrigger
PropertyChanged
Make
Решить проблему можно двумя путями. Первый предусматривает изменение объекта
PropertyChangedEventArgs
string.Empty
OnPropertyChanged()
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 декорируются с помощью шаблона отображения ошибки, когда одно из них обновляется. Так почему бы ни генерировать событие всегда в такой манере? В значительной степени причиной является производительность. Вполне возможно, что обновление каждого свойства объекта приведет к снижению производительности. Разумеется, без тестирования об этом утверждать нельзя, и конкретные ситуации могут (и вероятно будут) варьироваться.
Другое решение предполагает генерацию события
PropertyChanged
Make
Color
Интерфейс INotifyDataErrorInfo
Интерфейс
INotifyDataErrorInfo
IDataErrorInfo
ValidatesOnNotifyDataErrors
true
Интерфейс
INotifyDataErrorInfo
INotifyDataErrorInfo
public interface INotifyDataErrorInfo
{
bool HasErrors { get; }
event EventHandler<DataErrorsChangedEventArgs>
ErrorsChanged;
IEnumerable GetErrors(string propertyName);
}
Свойство
HasErrors
GetErrors()
null
propertyName
propertyName
ErrorsChanged
PropertyChanged
CollectionChanged
Реализация поддерживающего кода
При реализации
INotifyDataErrorInfo
IDataErrorInfo
INotifyDataErrorInfo
CarPartial.cs
IDataErrorInfo
public 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>>
using
System.Collections.Generic
using System.Collections.Generic;
private readonly Dictionary<string,List<string>> _errors