Blog archive - залежні властивості

  1. Вступ
  2. Область дії змінних
  3. магія викриття
  4. Як створювати залежні властивості
  5. Зовсім властивості тільки для читання
  6. Вкладені залежні властивості
  7. Відстеження змін в залежних властивостях
  8. Як очистити локальну змінну

Коли ви почнете розробляти свої WPF додатки, то незабаром натрапите на «Зовсім Властивості» (DepedencyProperties). Вони являють собою практично те ж саме, що і нормальні властивості .NET, але їхня концепція у багато разів складніше і функціональніша.

Головна різниця полягає в тому, що змінна в нормальному .NET властивості зчитується з приватного члена класу, тоді як в DependencyProperty вона викликається динамічно при виклику методу GetValue (), який в свою чергу успадкує від DepedencyObject.

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

Переваги залежних властивостей:

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

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

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

Область дії змінних

Кожен раз, коли ви отримуєте доступ до залежного властивості, автоматично вибирається значення виходячи з пріоритету - від високого до низького. Потім перевіряється є локальне значення, чи ні. Якщо немає (призначений для користувача стильової тригер активний), ... то ця процедура проробляється ще раз, поки значення що не знайдено. Коли як значення «за замовчуванням» є завжди.

Blog archive - залежні властивості

Магія викриття ...

Кожен регістр елемента управління WPF є набором залежних властивостей, класу Dependency Property. Кожен з них складається з ключа, який повинен бути унікальний для типу; і метаданих, що містять значення зворотних викликів і значення за замовчуванням.

Всі типи, які використовують DependencyProperties, повинні бути успадковані від Dependency Object. Цей базовий клас визначать ключ і значення словника, яке містить локальні значення залежних властивостей. Тобто вводиться ключ і є ключ, який визначений залежним властивістю.

При доступі до залежного властивості через обгортку властивості .NET, викликається GetValue (DependencyProperty) для доступу до значення. Цей метод отримує значення, використовуючи процедуру, представлену на зображенні нижче. Якщо доступна локальна змінна, то він зчитує її безпосередньо без словника. Якщо змінна відсутня, то він йде вгору по логічному дереву і шукає успадковане значення. Якщо значення, не знайдено, то він бере значення за замовчуванням, встановлене у властивостях метаданих. Ця послідовність трохи спрощена, однак показує основні концепції роботи механізму.

Blog archive - залежні властивості

Як створювати залежні властивості?

Для створення залежного властивості, додайте статичне поле типу DependencyProperty вашому типу і викличте функцію DependencyProperty.Register () для створення екземпляра залежного властивості. Ім'я залежного властивості має завжди закінчуватися на ... Property. Так вимагає конвенція, щодо імен в WPF.

Для того щоб дозволити доступ до нього, як до нормального .NET властивості, вам треба створити обгортку для цієї властивості. Ця обгортка нічого не робить, крім як отримує і встановлює значення за допомогою методів GetValue () і SetValue (), успадкованими від DependencyObject і передає залежне властивість - DependencyProperty як ключ.

[Важливо]: Не додавайте ніякої логіки в ці властивості, тому що вони викликаються раз, тільки коли ви встановлюєте властивість з коду. Якщо ви встановите властивість з XAML, метод SetValue () викликається безпосередньо.

Якщо ви використовуєте середу розробки VisualStudio, ви можете надрукувати «propdp» і двічі натиснути TAB. для створення залежного властивості.

Кожне залежне властивість забезпечено функцією зворотного виклику, з метою можливості повідомлення, утримання значення, якої перевірки.

Повідомлення про зміну значення (callback)

Повідомлення про зміну значення являє собою статичний метод, який викликається кожен раз, при зміні значення TimeProperty. Нове значення передається в EventArgs; об'єкт, на який змінилося значення, передається в якості джерела.

Утримання значення (callback)

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

Перевірка значення (callback)

З використанням перевірки значення на коректність, ви перевіряєте, чи відповідає значення дійсності. Якщо повертається false, значить що буде згенеровано виняток ArgumentException. У цьому прикладі потрібно, щоб дані не стали винятком із DateTime.

Зовсім властивості доступні тільки для читання

Деякі залежні властивості в WPF елементах управління доступні тільки для читання. Вони часто використовуються, для відстеження стану елемента управління. Наприклад, властивість IsMouseOver. Немає ніякої необхідності ставити будь-яке значення цій властивості.

Може, ви запитайте себе, а чому б не використовувати нормальне .NET властивість? Одна з основних причин є те, що ви не зможете задати тригер нормальному .NET властивості.

Створення властивості, доступного тільки для читання схоже на створення звичайного DependencyProperty.Insted. Замість виклику DependencyProperty.Register () ви викликаєте DependencyProperty.RegisterReadonly (). Це повертає вам DependencyPropertyKey. Цей ключ повинен бути збережений в приватному або в статичному захищеним, доступним тільки для читання, поле вашого класу. Ключ дає вам доступ до установки значення в межах вашого класу, і дозволяє використовувати його як нормальне залежне властивість.

Друга річ, яку необхідно зробити, це зареєструвати публічне залежне властивість, яке призначене для DependencyPropertyKey.DependencyProperty. Це властивість доступно тільки для читання, з наявністю зовнішнього доступу.

вкладені властивості

Вкладені властивості є спеціальним видом DependencyProperty. Вони дозволяють задавати значення об'єкту, який нічого не знає про це значення.

Хорошим прикладом може послужити механізм розташування панелей. Кожна панель має потребу в різних даних, для здатності вирівнювання її дочірніх елементів. Робочої поверхні (Canvas) необхідні параметри Top і Left. Прикріпленою панелі необхідний параметр Dock і т.д. І нарешті, ви можете написати свій власний макет розташування панелей, цей список нескінченний. Ви бачите, що неможливо мати одні й ті ж властивості на всіх WPF елементах управління.

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

Щоб встановити значення вкладеному властивості, додайте атрибут XAML з префіксом елемента, який забезпечує вкладене властивість. Для установки властивостей Canvas.Top і Canvas.Left кнопки, що вирівнюється в межах робочої поверхні. Ви можете написати:

Відстеження змін залежних властивостей

Якщо ви хочете відслідковувати залежне властивість, то успадкує тип, який визначає властивість, а потім перевизначите властивість метаданих і передайте зворотний виклик - PropertyChangedCallback (). Однак набагато простіше отримати DependencyPropertyDescriptor і підключити зворотний виклик за допомогою виклику AddValueChanged ().

Як очистити локальне значення?

NULL - також є коректним локальним значенням. З цього, існує постійна DependencyProperty.UnsetValue, яка описує невстановлена ​​значення.

Схожі статті