Ноу Інти, лекція, базові інструменти wpf

Анотація: Властивості залежностей і маршрутизовані події є новими об'єктами в технології WPF, які забезпечують такі можливості як анімація, прив'язка даних і стилі. Використання властивостей залежностей дозволяє відстежувати їх зміна на різних рівнях ієрархії елементів програми. Маршрутизуються подія може виникати в одному елементі, а оброблятися в інших елементах, піднімаючись або опускаючись по ієрархії елементів дерева візуалізації. Прив'язка даних дозволяє пов'язувати елементи управління і інтерфейсні елементи з даними, використовуючи властивості залежностей. В процесі прив'язки даних можна проводити їх перетворення і перевірку.

Отримати початкові знання про властивості залежностей і маршрутизованих події, способах їх визначення, створення та використання. Вивчити призначення та можливості прив'язки даних в додатку, їх перетворення і перевірки в процесі введення.

Властивості залежностей і маршрутизовані події

В технології WPF визначені властивості залежностей. які є елементами більш високого рівня функціональності в порівнянні зі звичайними властивостями Microsoft. NET [4]. [8]. Властивості залежностей забезпечують можливість роботи з основними засобами WPF, такими як анімація. прив'язка даних і стилі. Більшість властивостей, якими володіють елементи WPF, є властивостями залежностей. Їх можна розглядати як звичайні властивості. Net. але вони мають додатковим набором можливостей WPF. У концептуальному відношенні поведінка властивостей залежностей не відрізняється від поведінки звичайних властивостей, але на більш низькому рівні уявлення є інша реалізація. Властивості залежностей ефективно споживають пам'ять і підтримують такі високорівневі особливості, як повідомлення про зміни та успадкування значень властивостей. Крім того, в WPF введені маршрутизовані події. які мають більші можливості в порівнянні зі звичайними подіями. NET. Маршрутизовані події можуть переміщатися по дереву елементів (спускатися і підніматися) і дозволяють виконувати обробку події в одному елементі при його виникненні в іншому елементі.

властивості залежностей

При створенні властивості залежностей необхідно визначити екземпляр класу DependencyProperty. який повинен бути статичним і доступним тільки для читання. Припустимо, що в класі NodeImage необхідно визначити властивість залежно Fill. яке буде описувати кисть для заливки будь-яких графічних об'єктів.

Відповідно до прийнятих правил іменування властивостей залежностей ім'я оголошується властивості має складатися з двох частин - імені, в нашому випадку Fill. і слова Property. тобто FillProperty. Модифікатор readonly означає, що створюване властивість залежно FillProperty доступно тільки для читання і може отримати значення тільки в статичному конструкторі класу, що містить дане поле, тобто в нашому випадку - конструкторі класу NodeImage. Оголошене властивість залежності має бути зареєстровано в WPF, що виконується в статичному конструкторі відповідного класу.

У конструкторі для реєстрації властивості залежно спочатку створюються метадані metadata - об'єкт класу FrameworkPropertyMetadata. У метаданих для властивості FillProperty задається значення за замовчуванням (null) і необхідність перемальовування об'єкта при зміні його властивостей (AffectsRender = true). Реєстрація проводиться методом DependencyProperty.Register (). для якого параметрами задається ім'я властивості (Fill), його тип (typeof (Brush)), тип об'єкта, в якому реєструється властивість (typeof (NodeImage)) і метадані (metadata). У загальному випадку при реєстрації властивості залежностей додатково може здаватися метод зворотного виклику, який буде проводити перевірку правильності властивостей.

Для забезпечення доступу до властивостей залежностей необхідно оголосити властивість Fill. тобто упакувати його в звичайну оболонку властивостей, використовуючи методи SetValue () і GetValue ().

Створене властивість залежностей Fill можна використовувати в коді класу NodeImage як звичайне властивість.

Деякі класи можуть спільно використовувати один і той же властивість залежностей, навіть якщо вони мають окремі ієрархії класів.

Різновидом властивостей залежностей є приєднуються властивості залежностей. Дані властивості застосовується до класу, відмінного від того, в якому воно визначено. Для реєстрації товариства, що приєднується властивості залежностей використовується метод RegisterAttached (). Упаковувати дане властивість немає необхідності

Властивості залежностей підтримують повідомлення про зміни та динамічне дозвіл значень.

При зміні значень властивості залежностей здійснюється зворотний виклик, який відповідає за оновлення прив'язок даних і запуск тригерів. З цього випливає, що для підтримки заданої функціональності при зміні властивостей залежностей необхідно створити прив'язку, яка буде використовувати значення властивості, або написати тригер, який буде автоматично змінювати інше властивість або виконання інших дій.

Динамічне дозвіл значень властивостей залежностей визначає механізм вилучення значень з властивостей залежностей. Під час вилучення значень з властивостей система WPF визначає фундаментальне значення, з огляду на наступні фактори:

  • значення за замовчуванням;
  • успадковане значення;
  • значення з стилю теми;
  • значення з стилю проекту;
  • локальне значення.

Найбільш високий пріоритет має локальне значення, якщо воно встановлено в програмі. Якщо локальне значення не задано, установка значення передається вгору за списком наступного елементу, який може його прийняти, аж до значення за замовчуванням.

Маршрутизовані події

Маршрутизуються подія - це повідомлення про подію, яка виникла в одному елементі, а генерація може здійснюватися в іншому елементі. Маршрутизуються подія представляється статичним полем. доступним тільки для читання, яке зареєстровано в конструкторі і упаковано стандартним визначенням події .NET.

Наприклад, для класу NodeImage необхідно визначити маршрутизуються подія DeleteNode. Для цього створюємо статичний екземпляр класу RoutedEvent. який оголошується з модифікатором readonly. До імені події повинен додавати постфікси Event.

Реєстрація маршрутизациї події повинна проводитися в статичному конструкторі класу за допомогою методу RegisterRoutedEvent.

При реєстрації задається ім'я події (DeleteNode), тип маршруту (RoutingStrategy.Bubble), делегат, який визначає синтаксис обробника події (в нашому випадку RoutedEventHandler) і клас, до якого належить подія (NodeImage).

Пакувальник події визначає методи для додавання і видалення прослуховування подій: AddHandler () і RemoveHandler ().

Клас, в якому створено маршрутизуються подія, повинен відповідати за його генерацію. У класі NodeImage в контекстному меню є пункт (itemDelete), який відповідає за генерацію події DeleteNodeEvent.

У обробнику ContextMenu_OnClick () створюється екземпляр (argsEvent) класу RoutedEventArgs. який містить інформацію про стан і дані події, пов'язані з маршрутизациї подією.

При завантаженні даних з БД виникає виняток InvalidOperationException з повідомленням: Елемент колекції повинен бути порожнім перед використанням ItemsSource. Знаю, що для заповнення DataGrid можна використовувати колекції Items або ItemsSource, але одночасно їх використовувати не можна: якщо задано значення для властивості ItemsSource і в коді C # додається елемент в Items, виникає виключення.
Питання, як відстежити і відключити додавання елемента в Items?

У п'ятій лекції на другій сторінці в компіляторі вискакує помилка в рядку:

ObjectQuery employees = DataEntitiesEmployee.Employees;

Неможливо неявно перетворити тип "System.Data.Entity.DbSet"В" System.Data.Entity.Core.Objects.ObjectQuery".

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

Схожі статті