Опубликован: 08.07.2011 | Уровень: для всех | Доступ: платный
Лекция 3:

Базовые инструменты WPF

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >

Для обработки события Error необходимо установить свойство Binding.NotifyOnValidationError в True:

<Binding Path="Factor" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" 
 NotifyOnValidationError="True">

Событие Error является маршрутизируемым, использует передачу вверх и поэтому его можно обработать в родительском контейнере, например в Grid окна:

<Grid Name="gridPrimir" Height="85" Validation.Error="gridPrimir_Error">

Код обработчика будет отображать сообщение с информацией об ошибке:

private void gridPrimir_Error(object sender, ValidationErrorEventArgs e)
{
    if (e.Action == ValidationErrorEventAction.Added)
    {
        MessageBox.Show(e.Error.ErrorContent.ToString(), "Предупреждение",
                             MessageBoxButton.OK, MessageBoxImage.Warning);
    }
}

Свойство ValidationErrorEventArgs.Error представляет объект ValidationError, который содержит информацию об исключении ( Exception ), сформированном в правиле ( ValidationRule ), ассоциированном с объектом Binding ( BindingInError ) и специальную информацию, возвращаемую объектом ValidationRule ( ErrorContent ). На рис. 3.10 и рис. 3.11 приведены реакция приложения на ввод некорректных данных.

Реакция на ввод недопустимого символа

Рис. 3.10. Реакция на ввод недопустимого символа
Реакция на ввод недопустимого числа

увеличить изображение
Рис. 3.11. Реакция на ввод недопустимого числа

Информацию об ошибке можно получить и другим способом. Можно отобразить сообщение об ошибке в ToolTip элемента TextBox. При этом сообщение об ошибке будет появляться, когда пользователь поместим курсор мыши над элементом TextBox. Для реализации такого варианта необходимо создать шаблон ошибок, который будет содержать триггер, реагирующий на присваивание свойству Validation.HasError значения true и применит ToolTip с сообщением об ошибке:

<Window.Resources>
  <Style TargetType="{x:Type TextBox}" >
    <Style.Triggers>
       <Trigger Property="Validation.HasError" Value="True">
          <Setter Property="ToolTip" Value=
                           "{Binding RelativeSource = {RelativeSource Self}, 
            Path = (Validation.Errors)[0].ErrorContent}" />
       </Trigger>
    </Style.Triggers>
  </Style>
</Window.Resources>

При формировании свойства Path свойство Validation.Errors заключается в скобки, так как оно является присоединенным свойством, и используется индексатор для извлечения объекта ValidationError из коллекции для получения содержания ошибки ErrorContent. На рис. 3.12 и рис. 3.13 приведены примеры применения подсказки для проверки ввода данных.

Подсказка при вводе недопустимого символа

Рис. 3.12. Подсказка при вводе недопустимого символа
Подсказка при вводе недопустимого числа

Рис. 3.13. Подсказка при вводе недопустимого числа

Ключевые термины

Свойство зависимостей, присоединяемое свойство зависимостей, маршрутизируемое событие, привязка данных, объект-источник, целевое свойство, преобразование данных, проверка достоверности вводимых данных.

DependencyProperty, FrameworkPropertyMetadata, DependencyProperty.Register, RoutedEvent, RoutedEventHandler, RoutedEventArgs, IValueConverter, ValidationRule.

Краткие итоги

Свойства зависимостей и маршрутизируемые события являются эффективными инструментами технологии WPF для построения привязки объектов и обеспечения гибкости обработки разнообразных событий в приложении. Преобразование данных расширяет возможности привязки их привязки, проверка корректности ввода обеспечивает повышение надежности работы приложения.

Ресурсы для углубленного изучения

  1. Свойства // http://msdn.microsoft.com/ru-ru/library/ms753192.aspx.
  2. Событя // http://msdn.microsoft.com/ru-ru/library/ms753115.aspx.
  3. Привязка данных // http://msdn.microsoft.com/ru-ru/library/cc278072(v=VS.95).aspx.
  4. [ 4 ] , стр. 175 – 219.
  5. [ 6 ] , стр. 978 – 1104, 1171 - 1212.
  6. [ 8 ] , стр. 150 – 192.
  7. [ 9 ] , стр. 857 – 890, 995 - 1101.

Вопросы для самопроверки

  1. Поясните назначение свойств зависимости в WPF.
  2. Как именуются свойства зависимости?
  3. Как объявляются свойства зависимости?
  4. Как регистрируются свойства зависимости?
  5. Как происходит динамическое разрешение значений свойств зависимостей?
  6. Поясните назначение маршрутизируемого события.
  7. Как именуются маршрутизируемое событие?
  8. Как объявляются маршрутизируемое событие?
  9. Как регистрируются маршрутизируемое событие?
  10. Какие существуют типы маршрутизируемых событий?
  11. Поясните основные принципы привязки данных.
  12. Какие требования предъявляются к источнику и приемнику данных при выполнении привязки данных?
  13. Какие свойства используются при привязке к объекту, не являющемуся элементом?
  14. Как определяется направление привязки данных?
  15. Для чего в технологии WPF используется преобразование данных?
  16. Каким требованиям должен соответствовать класс, используемый как конвертор данных?
  17. Сколько правил может содержать коллекция Binding.ValidationRules?
< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
Александр Петров
Александр Петров

При загрузке данных из БД возникает исключение InvalidOperationException с сообщением: Элемент коллекции должен быть пустым перед использованием ItemsSource. Знаю, что для заполнения DataGrid можно использовать коллекции Items или ItemsSource, но одновременно их использовать нельзя: если задано значение для свойства ItemsSource и в коде C# добавляется элемент в Items, возникает исключение. 
Вопрос, как отследить и отключить добавление элемента в Items?

Максим Спиридонов
Максим Спиридонов

В пятой лекции на второй странице в компиляторе выскакивает ошибка в строчке :

ObjectQuery<Employee> employees = DataEntitiesEmployee.Employees;

Ошибка CS0029

Не удается неявно преобразовать тип "System.Data.Entity.DbSet<WpfApplProject.Employee>" в "System.Data.Entity.Core.Objects.ObjectQuery<WpfApplProject.Employee>".

в using прописал все как положено, здесь похоже именно с преобразованием типов проблемы

Igor Chelyadinski
Igor Chelyadinski
Беларусь, Минск, №54, 2013
Валентина Алешина
Валентина Алешина
Россия