Язык программирования C#9 и платформа .NET5
Часть 566 из 642 Информация о книге
Комбинирование IDataErrorInfo С INotifyDataErrorInfo для проверки достоверности
В предыдущем разделе было показано, что реализацию интерфейса
можно добавить к частичному классу, т.е. обновлять блокиIDataErrorInfoне понадобится. Кроме того, индексатор автоматически вызывается при возникновении событияsetв свойстве. КомбинированиеPropertyChangedиIDataErrorInfoпредоставляет дополнительные возможности для проверки достоверности изINotifyDataErrorInfo, а также отделение от блоковINotifyDataErrorInfo, обеспечиваемоеset.IDataErrorInfoЦель применения
не в том, чтобы запускать проверку достоверности, а в том, чтобы гарантировать вызов кода проверки, который задействуетIDataErrorInfo, каждый раз, когда для объекта генерируется событиеINotifyDataErrorInfo. Поскольку интерфейсPropertyChangedне используется для проверки достоверности, необходимо всегда возвращатьIDataErrorInfoиз индексатора. Модифицируйте индексатор и вспомогательный методstring.Emptyследующим образом:CheckMakeAndColor()public string this[string columnName]{get{ClearErrors(columnName);switch (columnName){case nameof(Id):break;case nameof(Make):CheckMakeAndColor();if (Make == "ModelT"){AddError(nameof(Make), "Too Old");hasError = true;}break;case nameof(Color):CheckMakeAndColor();break;case nameof(PetName):break;}return string.Empty;}}internal bool CheckMakeAndColor(){if (Make == "Chevy" && Color == "Pink"){AddError(nameof(Make), $"{Make}'s don't come in {Color}");AddError(nameof(Color),$"{Make}'s don't come in {Color}");return true;}return false;}Запустите приложение, выберите автомобиль
и измените цвет наChevy. В дополнение к декораторам красного цвета вокруг текстовых полей Make и Model будет также отображаться декоратор в виде красного прямоугольника, охватывающего целиком всю сетку, в которой находятся поля с детальной информацией об автомобиле (рис. 28.3).PinkЭто еще одно преимущество применения интерфейса
. В дополнение к элементам управления, которые содержат ошибки, элемент управления, определяющий контекст данных, также декорируется шаблоном отображения ошибки.INotifyDataErrorInfoОтображение всех ошибок
Свойство
классаErrorsвозвращает все ошибки проверки достоверности для конкретного объекта в форме объектовValidation. Каждый объектValidationErrorимеет свойствоValidationError, которое содержит список сообщений об ошибках для свойства. Это означает, что сообщения об ошибках, которые нужно отобразить, находятся в списке внутри списка. Чтобы вывести их надлежащим образом, понадобится создать элементErrorContent, содержащий еще один элементListBox. Звучит слегка запутанно, но вскоре все прояснится.ListBoxПервым делом добавьте одну строку в
и удостоверьтесь в том, что значение свойстваDetailsGridэлементаHeightсоставляет не менееWindow. Поместите в последнюю строку элемент управления300и привяжите его свойствоListBoxкItemsSource, используяDetailsGridдляValidation.Errors:Path<ListBox Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="2"ItemsSource="{Binding ElementName=DetailsGrid, Path=(Validation.Errors)}"></ListBox>Добавьте к
элементListBox, а в него — элемент управленияDataTemplate, привязанный к свойствуListBox. Контекстом данных для каждого элементаErrorContentв этом случае является объектListBoxItem, так что устанавливать контекст данных не придется, а только путь. Установите путь привязки вValidationError:ErrorContent<ListBox.ItemTemplate><DataTemplate>
