Программирование >>  Расширенный wf 

1 ... 4 5 6 [ 7 ] 8 9 10 ... 15


Чтобы отобразить ошибку, как только контекст поля ввода изменится, вы можете установить свойство ValidatesOnException расширения разметки Binding в True. При неверном значении (как только генерируется исключение, когда должно быть установлено значение) TextBox окружается красной рамкой, как показано на

рис. 35.13.


Рис. 35.13. Вывод рамки вокруг TextBox при генерации исключения

<Label Margin= 5 Grid.Row= 0

Grid.Column= 0 >Value1:</Label> <TextBox Margin= 5 Grid.Row= 0 Grid.Column= 1

Text= {Binding Path=Value1, ValidatesOnExceptions=True} />

Чтобы иным способом вернуть информацию об ошибке пользователю, вы можете присвоить присоединенное свойство ErrorTemplate, определенное классом Validation, к шаблону, определяющему пользовательский интерфейс для ошибок. Новый шаблон для обозначения ошибок показан здесь с ключом validationTemplate. Шаблон ControlTemplate помещает красный восклицательный знак перед существующим содержимым элемента управления.

<ControlTemplate x:Key= validationTemplate > <DockPanel>

<TextBlock Foreground= Red FontSize= 20 >!</TextBlock>

<AdornedElementPlaceholder/>

</DockPanel> </ControlTemplate>

Установка validationTemplate в присоединенное свойство Validation. ErrorTemplate активизирует шаблон с TextBox:

<Label Margin= 5 Grid.Row= 0 Grid.Column= 0 >Value1:</Label>

<TextBox Margin= 5 Grid.Row= 0 Grid.Column= 1

Text= {Binding Path=Value1, ValidatesOnExceptions=True} Validation.ErrorTemplate= {StaticResource validationTemplate} />

Новый вид приложения показан на рис. 35.14.

Другой вариант специального сообщения об ошибке заключается в регистрации события Error класса Validation. В этом случае свойство NotifyOnValidationError должно быть установлено в True.


Рис. 35.14. Изменение внешнего вида приложения при генерации исключения

Информация об ошибке сама по себе может быть доступна через коллекцию Errors класса Validation. Чтобы отобразить информацию об ошибке в ToolTip элемента управления TextBox, вы можете создать триггер свойства, как показано ниже. Триггер активизируется, как только свойство HasError класса Validation устанавливается в True. Триггер устанавливает свойство ToolTip элемента TextBox.

<Style TargetType= {x:Type TextBox} > <Style.Triggers> <Trigger Property= Validation.HasError Value= True > <Setter Property= ToolTip

Value= {Binding RelativeSource=

{x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent} /> </Trigger> </Style.Triggers> </Style>



Информация об ошибках данных

Другой способ обращения с ошибками состоит в том, что объект .NET реализует интерфейс IDataErrorInfo.

Класс SomeData теперь изменен для реализации интерфейса IDataErrorInfo. Этот интерфейс определяет свойство Error и индексатор со строковым аргументом. При проверке достоверности WPF во время привязки данных индексатор вызывается, и имя проверяемого свойства передается в качестве аргумента columnName. С такой реализацией значение проверяется на предмет допустимости, в противном случае передается строка ошибки.

В данном случае проверка достоверности выполняется на свойстве Value2, которое реализовано с использованием простой нотации свойства C# 3.0:

public class SomeData : IDataErrorInfo

private int valuel; public int Valuel {

return valuel;

set {

if (value < 5 value > l2) throw new ArgumentException(

value must not be less than 5 or greater than l2 ); valuel = value;

public int Value2 { get; set; } string IDataErrorInfo.Error {

return null;

string IDataErrorInfo.this[string columnName] {

get {

if (columnName == Value2 )

if (this.Value2 < 0 this.Value2 > 80)

return age must not be less than 0 or greater than 80 ;

return null;

Для сущностного класса .NET не ясно? что должен возвращать индексатор; например, чего ожидать от объекта типа Person, вызывающего индексатор? Вот почему лучше ясно реализовать интерфейс ISataErrorlnfo. Таким образом, индексатор может быть доступен только с использованием этого интерфейса, и класс .NET может предусматривать другую реализацию для других целей.



Если вы устанавливаете свойство ValidatesOnDataErrors класса Binding в true, то во время привязки используется интерфейс IDataErrorInfo. Здесь при изменении TextBox механизм привязки вызывает индексатор интерфейса и передает Value2 переменной columnName:

<Label Margin= 5 Grid.Row= 1 Grid.Column= 0 >Value2:</Label> <TextBox Margin= 5 Grid.Row= 1 Grid.Column= 1

Text= {Binding Path=Value2, ValidatesOnDataErrors=True} />

Специальные правила проверки достоверности

Чтобы получить больше контроля над процессом проверки достоверности, вы можете реализовать специальное правило проверки достоверности. Класс, реализующий такое правило, должен наследоваться от базового класса ValidationRule.

В предыдущих двух примерах также были использованы правила проверки достоверности. Два класса-наследника абстрактного базового класса ValidationRule - это DataErrorValidationRule и ExceptionValidationRule. Класс DataErrorValidationRule активизируется установкой свойства ValidatesOnDataErrors и использует интерфейс IDataErrorInfo; ExceptionValidationRule имеет дело с исключениями и активизируется установкой свойства ValidatesOnException.

Здесь правило проверки достоверности реализовано для верификации регулярного выражения. Класс RegularExpressionValidationRule наследуется от базового класса ValidationRule и переопределяет абстрактный метод Validate(), определенный в базовом классе. В этой реализации класс RegEx из пространства имен System.Text.RegularExpressions используется для проверки достоверности выражения, определенного свойством Expression.

public class RegularExpressionValidationRule : ValidationRule

public string Expression { get; set; } public string ErrorMessage { get; set; } public override ValidationResult Validate(object value, CultureInfo cultureInfo)

ValidationResult result = null; if (value != null)

Regex regEx = new Regex(Expression); bool isMatch = regEx.IsMatch(value.ToString()); result = new ValidationResult(isMatch, isMatch ? null : ErrorMessage);

return result;

Вместо использования расширения разметки Binding теперь привязка осуществляется как дочерний элемент элемента TextBox.Text. Объект привязки теперь определяет свойство Email, реализованное в простом синтаксисе свойства. Свойство UpdateSourceTrigger определяет, когда источник должен быть обновлен. Возможные опции для обновления источника таковы:

□ когда значение свойства меняется, что происходит при вводе каждого символа пользователем;

□ когда элемент утрачивает фокус;

□ явно.



1 ... 4 5 6 [ 7 ] 8 9 10 ... 15

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика