Язык программирования C#9 и платформа .NET5
Часть 563 из 642 Информация о книге
Показанный далее интерфейс
содержит два свойства: индексатор и строковое свойство по имениIDataErrorInfo. Следует отметить, что механизм привязки WPF не задействует свойствоError.Errorpublic interface IDataErrorInfo{string this[string columnName] { get; }string Error { get; }}Вскоре вы добавите частичный класс
, но сначала необходимо модифицировать класс в файлеCar, пометив его как частичный. Добавьте в папкуCar.csеще один файл по имениModels. Переименуйте этот класс вCarPartial.cs, пометьте его какCarи обеспечьте реализацию классом интерфейсаpartial. Затем реализуйте члены интерфейсаIDataErrorInfo. Вот начальный код:IDataErrorInfopublic partial class Car : IDataErrorInfo{public string this[string columnName] => string.Empty;public string Error { get;}}Чтобы привязанный элемент управления мог работать с интерфейсом
, в выражение привязки потребуется добавитьIDataErrorInfo. Модифицируйте выражение привязки для текстового поляValidatesOnDataErrorsследующим образом (и аналогично обновите остальные конструкции привязки):Make<TextBox Grid.Column="1" Grid.Row="1"Text="{Binding Path=Make, <b>ValidatesOnDataErrors=True</b>}" />После внесения изменений в конструкции привязки индексатор вызывается на модели каждый раз, когда возникает событие
. В качестве параметраPropertyChangedиндексатора используется имя свойства из события. Если индексатор возвращаетcolumnName, то инфраструктура предполагает, что все проверки достоверности прошли успешно и какие-либо ошибки отсутствуют. Если индексатор возвращает значение, отличающееся отstring.Empty, тогда в свойстве для данного объекта присутствует ошибка, из-за чего каждый элемент управления, привязанный к этому свойству специфического экземпляра класса, считается содержащим ошибку. Свойствоstring.EmptyобъектаHasErrorустанавливается вValidationи активизируется декораторtrueдля элементов управления, на которые повлияла ошибка.ErrorTemplateДобавьте простую логику проверки достоверности к индексатору в файле
. Правила проверки элементарны :CorePartial.cs• если
равноMake, то установить сообщение об ошибке вModelT(слишком старая модель);"Too Old"• если
равноMakeиChevyравноColor, то установить сообщение об ошибке вPink(модель в таком цвете не поставляется).$" {Make}'s don't come in {Color}"Начните с добавления оператора
для каждого свойства. Во избежание применения "магических" строк в операторахswitchвы снова будете использовать операциюcase. В случае сквозного прохода через операторnameofвозвращаетсяswitch. Далее добавьте правила проверки достоверности. В подходящих операторахstring.Emptyреализуйте проверку значения свойства на основе приведенных выше правил. В оператореcaseдля свойстваcaseпервым делом проверьте, равно ли значениеMake. Если это так, тогда возвратите сообщение об ошибке. В случае успешного прохождения проверки в следующей строке кода вызовите вспомогательный метод, который возвратит сообщение об ошибке, если нарушено второе правило, илиModelT, если нет. В оператореstring.Emptyдля свойстваcaseпросто вызовите тот же вспомогательный метод. Ниже показан код:Colorpublic string this[string columnName]{get{switch (columnName){case nameof(Id):break;case nameof(Make):return Make == "ModelT"? "Too Old": CheckMakeAndColor();case nameof(Color):return CheckMakeAndColor();case nameof(PetName):break;}return string.Empty;}}internal string CheckMakeAndColor(){if (Make == "Chevy" && Color == "Pink"){return $"{Make}'s don't come in {Color}";}return string.Empty;}Запустите приложение, выберите автомобиль
(Red Rider) и измените значение в поле Make (Производитель) наFord. После того, как фокус покинет поле, появится декоратор ошибки красного цвета. Выберите в поле со списком автомобильModelT(Kit) и щелкните на кнопке Change Color, чтобы изменить его цвет наChevy. Вокруг поляPinkнезамедлительно появится декоратор ошибки красного цвета, но возле поля Make он будет отсутствовать. Измените значение в поле Make наColorи переместите фокус из этого поля; декоратор ошибки красного цвета не появляется!Ford