Використання властивості DataContext елементів для призначення джерела прив'язки
Іноді кілька приймачів потрібно прив'язати до одного і того ж джерела. Щоб не дублювати в кожному вираженні прив'язки ім'я джерела і якось автоматизувати цю задачу, в WPF дуже часто використовують властивість DataContext. Це властивість введено класом FrameworkElement і успадковується кожним елементом, похідним від цього класу. Його використання є альтернативним способом позначення об'єкта-джерела, задіяного в прив'язці.
Якщо у виразі прив'язки цільового елемента джерело не вказано за допомогою значення атрибута Source. то WPF автоматично буде шукати його спочатку в елементі з виразом прив'язки, а потім - в батьківських елементах вгору у напрямку до кореня логічного дерева до тих пір, поки джерело не буде знайдений. Якщо джерело не буде виявлений, то WPF просто буде мовчати, оскільки механізм прив'язки не генерує винятків. Зазвичай намагаються звузити діапазон пошуку, поміщаючи визначення властивості DataContext в найближчий батьківський контейнер, що охоплює прив'язувати приймачі.
Виконуючи пошук по дереву, WPF намагається знайти перший контекст даних DataContext. не дорівнює null. Якщо контекст даних знайдений, він використовується для прив'язки, якщо немає, то вираз прив'язки не застосовує ніякого значення до цільового елементу і він нічого відображати не буде.
Припустимо, що є кілька елементів управління TextBlock. явним чином пов'язаних з одним і тим же джерелом прив'язки:
А ось ті ж самі три елементи управління TextBlock. пов'язані з контекстом даних DataContext контейнера StackPanel:
Якщо в черговому ближньому контейнері атрибут DataContext не визначений, пошук буде продовжено в наступному зовнішньому контейнері, поки не буде знайдений ненульовий контекст даних DataContext або пошук закінчиться невдачею.
Вкладка Page3. Використання властивості DataContext в цільовому елементі
У наступному прикладі властивість DataContext поміщено до приймальника прив'язки.
- Додайте в контейнер TabControl нову вкладку Page3 з наступною розміткою
В елементі ScrollBar атрибут Maximum = "100" означає верхню межу діапазону значень, LargeChange = "10" - крок зміни положення бігунка за клацання на областях праворуч і ліворуч від нього, SmallChange = "1" - крок зміни значення за клацання на кінцевих елементах лінійки . У наведеному прикладі властивість DataContext ніяких переваг не дає, а просто ділить вираз прив'язки на дві частини.
- Відкрийте програму - вкладка Page3 забезпечить наступну область виведення
Вкладка Page4. Використання властивості DataContext в батьківському елементі
- Додайте в контейнер TabControl нову вкладку Page4
- Перемістіть призначення джерела прив'язки властивості DataContext з приймача в батьківський елемент
наступним чином
елемент
- Випробуйте роботу вкладки Page4 - вона нічим не буде відрізнятися від вкладки Page3
Вкладка Page5. Прив'язка декількох приймачів до одного джерела без властивості DataContext
Розглянемо приклад, коли відмова від використання властивості DataContext спричиняє відносно громіздкий код розмітки.
- Додайте в контейнер TabControl вкладку Page5 з наступною розміткою
- Відкрийте програму - результат буде таким
Вкладка Page6. Прив'язка декількох приймачів до одного джерела з використанням властивості DataContext
- Додайте нову вкладку Page6 і перепишіть розмітку предудущей прикладу так
За рахунок того, що ми прибрали повторюється код одного і того ж джерела з виразів прив'язки цільових елементів і помістили його в властивість DataContext батьківського елемента, код прив'язки став більш елегантним.
- Відкрийте програму - уявлення вкладки Page6 повністю збігається з областю виведення вкладки Page5
Зробимо кілька зауважень: