|
Программирование >> Расширенный wf
Чтобы отобразить ошибку, как только контекст поля ввода изменится, вы можете установить свойство 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 определяет, когда источник должен быть обновлен. Возможные опции для обновления источника таковы: □ когда значение свойства меняется, что происходит при вводе каждого символа пользователем; □ когда элемент утрачивает фокус; □ явно.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |