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


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

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

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

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

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

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

Значения XAML

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

Замечания

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

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

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

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

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

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

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

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

x:Bind в ControlTemplate

Замечание

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

Начиная с 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>