В чем разница между этими двумя привязками:
<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>
?
wpf
relativesource
templatebinding
PaN1C_Showt1Me
источник
источник
Ответы:
TemplateBinding не совсем то же самое. Документы MSDN часто пишутся людьми, которым приходится тестировать односложные SDE о функциях программного обеспечения, поэтому нюансы не совсем верны.
Привязки TemplateBindings оцениваются во время компиляции по типу, указанному в шаблоне элемента управления. Это позволяет гораздо быстрее создавать скомпилированные шаблоны. Просто возьмите имя в шаблонной привязке, и вы увидите, что компилятор пометит его.
Обязательная разметка разрешается во время выполнения. При более медленном выполнении привязка разрешит имена свойств, которые не видны в типе, объявленном шаблоном. Медленнее, я укажу, что это своего рода относительный, так как операция привязки занимает очень мало процессора процессора. Если вы загружаете шаблоны управления с высокой скоростью, вы можете заметить это.
На практике используйте TemplateBinding, когда можете, но не бойтесь Binding.
источник
TemplateBinding - больше ограничений, чем при использовании обычного Binding
регулярное связывание - не имеет вышеуказанных ограничений TemplateBinding
источник
Еще одна вещь - TemplateBindings не позволяет конвертировать значения. Они не позволяют вам передавать Converter и, например, автоматически не конвертируют int в строку (что является нормальным для Binding).
источник
TemplateBinding является сокращением для Binding с TemplatedParent, но он не предоставляет все возможности класса Binding, например, вы не можете управлять Binding.Mode из TemplateBinding.
источник
Я думал, что TemplateBinding не поддерживает Freezable типы (которые включают объекты кисти). Чтобы обойти проблему. Можно использовать TemplatedParent
источник
Они используются аналогичным образом, но у них есть несколько отличий. Вот ссылка на документацию TemplateBinding: http://msdn.microsoft.com/en-us/library/ms742882.aspx
источник