Що таке зв'язок шаблону проти прив’язки?


118

Я не міг зрозуміти BorderThickness="{TemplateBinding BorderThickness}. Ось код:

<ControlTemplate TargetType="{x:Type wpftoolkit:DataGridCell}">
    <Border Padding="{TemplateBinding Padding}" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            BorderThickness="{TemplateBinding BorderThickness}" 
            Background="{TemplateBinding Background}" 
            SnapsToDevicePixels="True">
        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
    </Border>
</ControlTemplate>

Також, будь ласка, поясніть інші види зв'язування.


чому це повернення і чому BorderThickness пишуть два рази "" "BorderThickness =" {TemplateBinding BorderThickness} "" "
prjndhi

1
@Euphoric Ця сторінка здається першим результатом Google для цього запиту. ;)
ANeves

Відповіді:


204

TemplateBinding використовується для прив’язки до властивостей елемента в рамках визначення шаблону. У вашому прикладі ви могли написати

 <Border Padding="{Binding Padding}" ...>

означає прив’язувати властивість прокладки кордону до властивості набивання ... що? Ви б хотіли сказати, "властивість блокування елемента управління, для якого використовується цей шаблон". Ви не можете дати йому ім'я, оскільки на даний момент ви не знаєте x: Ім'я елемента керування (навіть якби ви це зробили, воно не працюватиме, оскільки його в іншому діапазоні імен). Однак це можна зробити, визначивши відносне джерело

<Border Padding="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}" ...>

або використовувати TemplateBinding, який є ярликом (*) для вище

<Border Padding="{TemplateBinding Padding}" ...>

(*) Окрім того, що в цих сценаріях шаблонування є менш докладною, TemplateBinding має ще кілька відмінностей порівняно з звичайними палітурками:

  • Він оцінюється під час компіляції. (якщо, наприклад, властивості Padding не існувало, ви отримаєте помилку компіляції. Але якщо ви використовуєте прив'язку з TemplatedParent, ви побачите помилку лише під час виконання.)
  • Це завжди одностороння обов'язковість.
  • Це вимагає, щоб і вихідні, і цільові властивості були властивостями залежності .
  • Він має набагато меншу функціональність (відсутність StringFormat, Delay, IsAsync тощо. Див. Властивості Binding vs TemplateBindingExtention ).

58

Малюнок вартує тисячі слів. У цьому випадку це 7-хвилинне відео: https://www.youtube.com/watch?v=z-0TZR-7xLI

EDIT: Приклад:

  • A Buttonмає ControlTemplateвластивість та Heightвластивість за замовчуванням
  • Ви переосмислюєте ControlTemplateвластивість документа Button, написавши власну (наприклад, ви хочете зробити Ellipseкнопку перегляду замість Rectangle-вигляд)
  • Після того як ви зробили Ellipseнове ControlTemplate, ви хочете, Ellipseщоб розмір був такого ж розміру, як і Heightвластивість оригінальної кнопки
  • Таким чином, ви використовуєте TemplateBindingдля посилання Buttonна, Heightне називаючи йоговведіть тут опис зображення

Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Bhargav Rao

32

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

У WPF кожен елемент управління більш-менш відокремлений від його подання. Ви завжди можете змінити шаблон елементів керування і зробити так, щоб він виглядав зовсім інакше. Кнопка працює, як очікувалося, ControlTemplateлише з, Rectangleнаприклад, з. Тепер інколи доводиться ControlTemplateфактично використовувати властивості логічної частини елемента керування. І ось що TemplateBindingдля цього просто говорить ControlTemplate"Використовуйте цю властивість контролю, який ми проводимо візуальну презентацію". Хорошим прикладом є Backgroundвластивість кожного контролю, воно не має значення самостійно, воно набуває свого значення TemplateBindingдля контролю над дитиною в ControlTemplate.

Пов'язування самостійно дуже добре описано в MSDN . Це дуже приємна шпаргалка, яка насправді висить на моїй стіні біля мене. Він дає хороший огляд усіх наявних прив'язок.


6

Від TemplateBinding розширення розмітки , TemplateBindingпов'язує значення властивості в шаблоні елемента управління до значення якої - або іншого виставленим власності на шаблонному управлінні. Іншими словами, це для прив'язки значень у шаблоні.

Прив'язка з'єднує властивість прив'язування цілей та джерел даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.