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

Я не мог понять 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>

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

Ответ 1

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

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

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

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

или используйте TemplateBinding, которое является ярлыком (*) для выше

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

(*) В дополнение к тому, что в этих сценариях шаблона недостаточно многословный, TemplateBinding имеет пару отличий по сравнению с регулярным привязкой:

  • Он вычисляется во время компиляции. (если, например, свойство Padding не существовало, вы получили бы ошибку компиляции. Но если вы должны использовать привязку с TemplatedParent, вы увидите только ошибку во время выполнения.)
  • Это всегда односторонняя привязка.
  • Это требует, чтобы и исходные, и целевые свойства были зависимыми свойствами.
  • У него гораздо меньше функциональности (без StringFormat, Delay, IsAsync и т.д. см. свойства Binding vs TemplateBindingExtention).

Ответ 2

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

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

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

Ответ 3

Картинка стоит 1000 слов. В этом случае это 7 минут видео: https://www.youtube.com/watch?v=z-0TZR-7xLI

EDIT: Пример:

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

Ответ 4

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

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