Что такое привязка шаблона и привязка?

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>

Также объясните, пожалуйста, другие типы привязки.

prjndhi
источник
почему этот возврат и почему BorderThickness напишут два раза "" "BorderThickness =" {TemplateBinding BorderThickness} "" "
prjndhi
1
@Euphoric эта страница кажется первым результатом Google по этому запросу. ;)
ANeves

Ответы:

204

TemplateBinding используется для привязки к свойствам элемента в определении шаблона. В вашем примере вы могли бы написать

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

означает привязать свойство padding границы к свойству padding ... что? Вы хотели бы сказать: «свойство padding элемента управления, для которого используется этот шаблон». Вы не можете дать ему имя, потому что в настоящее время вы не знаете x: Name элемента управления (даже если бы вы это сделали, это не сработало бы, потому что оно находится в другой области имен). Однако вы можете сделать это, указав относительный источник

<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

РЕДАКТИРОВАТЬ: Пример:

  • A Buttonимеет ControlTemplateсвойство по умолчанию и Heightсвойство
  • Вы переопределяете ControlTemplateсвойство a Button, написав свое собственное (например, вы хотите сделать Ellipseкнопку -looking вместо Rectangle-looking)
  • После того, как вы сделали Ellipseв своем новом ControlTemplate, вы хотите, Ellipseчтобы он был того же размера, что и исходное Heightсвойство Button
  • Таким образом, вы используете TemplateBindingдля ссылки Button, Heightне называя еговведите описание изображения здесь
Плохой
источник
Хотя теоретически это может дать ответ на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки.
Бхаргав Рао
32

Эрен Эрсонменц уже достаточно хорошо объяснил это, но я хотел бы дать ему другую перспективу, чтобы лучше понять концепцию.

В WPF каждый элемент управления более или менее отделен от своего представления. Вы всегда можете изменить шаблон элементов управления и сделать его совершенно другим. Кнопка работает должным образом, например, если она ControlTemplateсостоит только из Rectangle. Теперь иногда необходимо, ControlTemplateчтобы фактически использовались свойства логической части элемента управления. И это то TemplateBinding, для чего он просто сообщает ControlTemplate«Используйте это свойство элемента управления, который мы даем визуальному представлению». Хорошим примером является Backgroundсвойство каждого элемента управления, само по себе оно не имеет значения, оно передается TemplateBindingдочернему элементу управления в ControlTemplate.

Сама по себе привязка очень хорошо описана в MSDN . Это очень хорошая шпаргалка, которая на самом деле висит у меня на стене рядом со мной. Он дает хороший обзор всех доступных привязок.

dowhilefor
источник
6

От TemplateBinding расширения разметки , TemplateBindingсвязывает значение свойства в шаблоне элемента управления к значению какой - либо другой выставленным собственности на шаблонном управлении. Другими словами, это для привязки значений в шаблоне.

Связывание связывает свойство целей привязки и источников данных.

Забавский
источник