Поделиться через


Расширение разметки {TemplateBinding}

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

Использование атрибута XAML

<object propertyName="{TemplateBinding sourceProperty}" .../>

Использование атрибута XAML (для свойства 'Setter' в шаблоне или стиле)

<Setter Property="propertyName" Value="{TemplateBinding sourceProperty}" .../>

Значения XAML

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

Замечания

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

Это весьма распространено, когда propertyName и targetProperty используют одно и то же имя свойства. В этом случае элемент управления может определить свойство самостоятельно и перенаправить свойство в существующее и интуитивно именованное свойство одного из его компонентов. Например, элемент управления, который включает TextBlock в его состав, который используется для отображения собственного свойства Text элемента управления, может включать этот XAML в состав шаблона элемента управления: <TextBlock Text="{TemplateBinding Text}" .... />

Типы, используемые в качестве значения исходного свойства и целевого свойства, должны совпадать. При использовании TemplateBindingнет возможности ввести преобразователь. Сбой сопоставления значений приводит к ошибке при анализе XAML. Если вам нужен преобразователь, можно использовать подробный синтаксис для привязки шаблона, например: {Binding RelativeSource={RelativeSource TemplatedParent}, Converter="..." ...}

Попытка использовать TemplateBinding за пределами определения ControlTemplate в XAML приведет к ошибке синтаксического анализа.

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

A TemplateBinding всегда является односторонней привязкой. Оба свойства должны быть свойствами зависимостей.

TemplateBinding — это расширение разметки. Расширения разметки обычно реализуются, если существует требование для исключения значений атрибутов, отличных от литеральных значений или имен обработчиков, и это требование является более общим, чем использование преобразователей типов для конкретных типов или свойств. Все расширения разметки в XAML используют символы "{" и "}" в синтаксисе атрибутов, что является соглашением, с помощью которого обработчик XAML распознает, что расширение разметки должно обрабатывать атрибут.

Примечание В реализации процессора XAML среды выполнения Windows не существует резервного представления класса для TemplateBinding. TemplateBinding предназначен исключительно для использования в разметке XAML. Существует не простой способ воспроизвести поведение в коде.

x:Bind в ControlTemplate

Замечание

Для использования x:Bind в ControlTemplate требуется Windows 10 версии 1809 (пакет SDK17763) или более поздней версии. Для получения дополнительной информации о целевых версиях см. раздел "Адаптивный код версии".

Начиная с Windows 10 версии 1809, вы можете использовать расширение разметки x:Bind везде, где вы используете TemplateBinding в ControlTemplate.

Свойство TargetType является обязательным (не необязательным) для ControlTemplate при использовании x:Bind.

С поддержкой x:Bind можно использовать привязки функций , а также двусторонняя привязка в ControlTemplate.

В этом примере свойство TextBlock.Text оценивается как Button.Content.ToString. TargetType в ControlTemplate выступает в качестве источника данных и выполняет тот же результат, что и templateBinding для родительского элемента.

<ControlTemplate TargetType="Button">
    <Grid>
        <TextBlock Text="{x:Bind Content, Mode=OneWay}"/>
    </Grid>
</ControlTemplate>