WPF TemplateBinding против RelativeSource TemplatedParent

В чем разница между этими двумя привязками:

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{TemplateBinding Property=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>

а также

<ControlTemplate TargetType="{x:Type Button}">
   <Border BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}">
      <ContentPresenter />
   </Border>
</ControlTemplate>

?

15.07.2009 12:52:23
если вам нужна TwoWay Binding, вам нужно использовать второй вариант
Joachim Kerschbaumer 23.09.2011 07:01:55
6 ОТВЕТОВ
РЕШЕНИЕ

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

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

Обязательная разметка разрешается во время выполнения. При более медленном выполнении привязка разрешит имена свойств, которые не видны в типе, объявленном шаблоном. Медленнее, я укажу, что это своего рода относительный, так как операция привязки занимает очень мало процессора процессора. Если вы загружаете шаблоны управления с высокой скоростью, вы можете заметить это.

На практике используйте TemplateBinding, когда можете, но не бойтесь Binding.

206
1.12.2009 01:52:30
Поэтому главное помнить: время компиляции против времени выполнения. TemplateBinding не будет работать, если вы попытаетесь изменить его во время выполнения. Правильно ?
PaN1C_Showt1Me 18.02.2010 07:29:25
Также обратите внимание, что использование Binding вместо TemplateBinding может повлиять на то, что вы видите во время разработки. В некоторых конфигурациях свойства, связанные с помощью {Binding RelativeSource ...}, не отображаются в конструкторе (хотя они все еще отображаются во время выполнения), но если вы переключитесь на использование {TemplateBinding ...}, эти свойства будут оценены во время разработки.
lfalin 12.11.2014 00:15:43
Одна вещь, которую я добавлю в случае, если она поможет будущим посетителям, заключается в том, что поскольку TemplateBinding оценивается во время компиляции, вы не можете использовать TemplateBinding для привязки к определенному пользователем присоединенному свойству. В случае определенных пользователем вложенных свойств вы должны использовать «{Binding RelativeSource = {RelativeSource TemplatedParent} ...}»
MNB 18.03.2020 18:59:54

Они используются аналогичным образом, но у них есть несколько отличий. Вот ссылка на документацию TemplateBinding: http://msdn.microsoft.com/en-us/library/ms742882.aspx

0
9.09.2011 17:38:44

TemplateBinding является сокращением для Binding с TemplatedParent, но он не раскрывает все возможности класса Binding, например, вы не можете управлять Binding.Mode из TemplateBinding.

17
10.07.2015 08:04:33

Я думал, что TemplateBinding не поддерживает Freezable типы (которые включают объекты кисти). Чтобы обойти проблему. Можно использовать TemplatedParent

1
20.01.2010 14:41:28

Еще одна вещь - TemplateBindings не позволяет конвертировать значения. Они не позволяют вам передавать Converter и, например, автоматически не конвертируют int в строку (что является нормальным для Binding).

22
24.05.2011 16:39:44
Спасибо Мирославу, с этой проблемой я столкнулся, переход на использование TemplatedParent решил проблему.
MikeKulls 4.07.2011 23:46:32

TemplateBinding - больше ограничений, чем при использовании обычного Binding

  • Более эффективен, чем Binding, но у него меньше функциональности
  • Работает только внутри визуального дерева ControlTemplate
  • Не работает со свойствами на Freezables
  • Не работает в триггере ControlTemplate
  • Предоставляет ярлык в настройке свойств (не такой подробный), например, {TemplateBinding targetProperty}

Обычное связывание - не имеет вышеуказанных ограничений TemplateBinding

  • Уважает родительские свойства
  • Сбрасывает целевые значения, чтобы очистить любые явно установленные значения
  • Пример: <Ellipse Fill = "{Binding RelativeSource = {RelativeSource TemplatedParent}, Path = Background}" />
35
27.02.2012 05:47:52