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

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

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

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

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

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

Значения XAML

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

Комментарии

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

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

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

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

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

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

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

Примечание В реализации процессора СРЕДА ВЫПОЛНЕНИЯ WINDOWS XAML отсутствует резервное представление класса для 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>