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


Расширение разметки {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 может ждать, пока все необходимые привязки среды выполнения имеют значения.

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

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>