Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Windows Presentation Foundation.docx
Скачиваний:
12
Добавлен:
13.08.2019
Размер:
1.13 Mб
Скачать

Проверка данных

Для привязки данных, которая передаёт информацию в объект-источник (режимы TwoWay и OneWayToSource), можно реализовать проверку данных. Если данные не проходят проверку, то источник не обновляется, а пользователь получает визуальный сигнал об ошибке.

Первый способ организации проверки заключается в создании и применении проверочных правил. Каждое проверочное правило – это наследник класса ValidationRuleс переопределённым методомValidate(). Этот метод получает проверяемое значение и информацию о культуре, а возвращает объект ValidationResult с результатом проверки. Ниже приведён пример правила, ограничивающего десятичные значения некоторым диапазоном:

publicclassPositivePriceRule : ValidationRule

{

privatedecimal min = 0;

privatedecimal max = Decimal.MaxValue;

publicdecimal Min

{

get { return min; }

set { min = value; }

}

publicdecimal Max

{

get { return max; }

set { max = value; }

}

publicoverrideValidationResult Validate(object value,

CultureInfo culture)

{

decimal price = 0;

try

{

price = Decimal.Parse((string)value, NumberStyles.Any,

culture);

}

catch

{

returnnewValidationResult(false, "Недопустимыесимволы");

}

if ((price < Min) || (price > Max))

returnnewValidationResult(false, "Внедиапазона");

else

returnnewValidationResult(true, null);

}

}

Проверочные правила помещают в коллекцию ValidationRules, имеющуюся у каждой привязки:

<TextBox>

<TextBox.Text>

<Binding Path="UnitCost" Mode="TwoWay">

<Binding.ValidationRules>

<local:PositivePriceRule Max="999.99"/>

</Binding.ValidationRules>

</Binding>

</TextBox.Text>

</TextBox>

Второй способ организации проверки основан на генерировании исключительной ситуации в методе установки свойства объекта-источника:

// фрагмент класса: определение свойства UnitCost

publicdecimal UnitCost

{

get { return unitCost; }

set

{

if (value<0)

{

thrownewArgumentException("UnitCost < 0");

}

else

{

unitCost = value;

}

}

}

Исключительные ситуации, возникающие при передаче информации в объект, отлавливаются при помощи специального встроенного проверочного правила ExceptionValidationRule,помещённого в ValidationRules.

<Binding.ValidationRules>

<ExceptionValidationRule />

</Binding.ValidationRules>

В качестве альтернативы использованиюExceptionValidationRule можно просто установить свойство привязкиValidatesOnExceptions в значение true.

Третий способ организации проверки данных основан на реализации объектом-источником интерфейсаSystem.ComponentModel.IDataErrorInfo. Интерфейс IDataErrorInfoсодержит два элемента: строковое свойствоError и строковый индексатор с ключом-строкой. Свойство Error– это общее описание ошибок объекта. Индексатор принимает имя свойства и возвращает соответствующую детальную информацию об ошибке. Ключевая идея в том, что вся логика обработки ошибок централизована в индексаторе.

Ниже приведён фрагмент класса, реализующего IDataErrorInfo. В примере проверяется на наличие ошибок только одно свойство.

publicclassProduct : IDataErrorInfo

{

publicstring ModelNumber { get; set; }

// обработкаошибокпроисходитздесь

publicstringthis[string propertyName]

{

get

{

if (propertyName == "ModelNumber"&&

ModelNumber.Any(c => !Char.IsLetterOrDigit(c)))

return"В ModelNumber допустимы буквы и цифры";

returnnull;

}

}

// WPF не использует это свойство

publicstring Error

{

get { returnnull; }

}

}

Чтобы заставить WPF использовать интерфейс IDataErrorInfo и приме­нять его для проверки ошибок при модификации свойства, нужно добавить встроенное правило DataErrorValidationRuleв коллекцию ValidationRules:

<Binding.ValidationRules>

<DataErrorValidationRule />

</Binding.ValidationRules>

В качестве альтернативы использованиюDataErrorValidationRule можно установить свойство привязкиValidatesOnDataErrors в значение true.

При нарушении любого из проверочных правил, инфраструктура WPFвыполняет следующие шаги:

  • В целевом элементеприсоединённое свойствоValidation.HasError устанавливается в true.

  • Создаётся объект ValidationError с информацией об ошибке и добавляется в присоединённую коллекциюValidation.Errors.

  • Если свойство привязки NotifyOnValidationError установлено в true, WPF инициирует в целевом элементе присоединённое событие Validation.Error.

Визуальное представление целевого элемента управления также изменяется при возникновении ошибки. Шаблон элемента заменяется шаблоном, определённым в свойстве Validation.ErrorTemplate. Например, в текстовом поле новый шаблон окрашивает контур рамки в красный цвет.