{TemplateBinding} マークアップ拡張
コントロール テンプレート内のプロパティの値を、template 宣言されたコントロールのその他の公開されているプロパティの値にリンクします。 XAML では、TemplateBinding は ControlTemplate 定義内でのみ使用できます。
XAML 属性の使用方法
<object propertyName="{TemplateBinding sourceProperty}" .../>
XAML 属性の使用方法 (テンプレートまたはスタイルの Setter プロパティの場合)
<Setter Property="propertyName" Value="{TemplateBinding sourceProperty}" .../>
XAML 値
項目 | 説明 |
---|---|
propertyName | setter 構文で設定されるプロパティの名前。 これは依存関係プロパティであることが必要です。 |
sourceProperty | template 宣言された型に存在する、別の依存関係プロパティの名前。 |
注釈
カスタム コントロールの作成者である場合でも、コントロール テンプレートを今あるコントロールに置き換える場合でも、コントロール テンプレートを定義するうえでは TemplateBinding を使うことが欠かせません。 詳しくは、「クイック スタート: コントロール テンプレート」をご覧ください。
propertyName と targetProperty では同じプロパティ名を使うことが一般的です。 この場合、コントロール自体でプロパティを定義し、プロパティを、そのいずれかのコンポーネントの直感的な名前を持つ既にあるプロパティに転送します。 たとえば、TextBlock をコントロールの合成に組み込んでコントロール自体の Text プロパティの表示に使う場合は、コントロール テンプレートの一部として次の XAML を含めることができます。<TextBlock Text="{TemplateBinding Text}" .... />
ソース プロパティとターゲット プロパティの値として使う型は一致する必要があります。 TemplateBinding を使うとコンバーターを導入する機会がありません。 値が一致しないと、XAML を解析したときにエラーが発生します。 コンバーターを必要とする場合は、次のようなテンプレート バインドの冗長な形式の構文を使うことができます。{Binding RelativeSource={RelativeSource TemplatedParent}, Converter="..." ...}
XAML の ControlTemplate 定義の外側で TemplateBinding を使うと、パーサー エラーが発生します。
親のテンプレート値も別のバインドとして延期される場合は、TemplateBinding を使用できます。 TemplateBinding の評価は、必要な実行時バインドに値が設定されるまで待機することができます。
TemplateBinding は常に一方向バインドです。 関連する両方のプロパティは、依存関係プロパティである必要があります。
TemplateBinding はマークアップ拡張です。 一般にマークアップ拡張機能を実装するのは、属性値をリテラル値やハンドラー名以外にエスケープする要件が存在し、その要件の適用範囲がグローバルで、特定の型やプロパティに型コンバーターを適用するだけにとどまらない場合です。 XAML のすべてのマークアップ拡張では、それぞれの属性構文で "{" と "}" の文字を使います。これは規約であり、これに従って XAML プロセッサは、マークアップ拡張で属性を処理する必要があることを認識します。
注: Windows ランタイム XAML プロセッサ実装では、TemplateBinding のバッキング クラス表現はありません。 TemplateBinding は、XAML マークアップでのみ使用できます。 コードの動作を再現する方法には単純なものがありません。
ControlTemplate での x:Bind
注意
ControlTemplate で x:Bind を使用するには、Windows 10 バージョン 1809 (SDK 17763) 以降が必要です。 ターゲット バージョンについて詳しくは、「バージョン アダプティブ コード」をご覧ください。
Windows 10 バージョン 1809 以降では、ControlTemplate で TemplateBinding を使用するどの場所でも x:Bind マークアップ拡張を使用できます。
x:Bind を使用する場合、ControlTemplate で TargetType プロパティが必須になります (省略可能ではありません)。
x:Bind のサポートにより、ControlTemplate で関数バインドと双方向のバインドの両方を使用できます。
この例では、TextBlock.Text プロパティは、Button.Content.ToString に評価されます。 ControlTemplate の TargetType はデータ ソースとして機能し、親への TemplateBinding と同じ結果を実現します。
<ControlTemplate TargetType="Button">
<Grid>
<TextBlock Text="{x:Bind Content, Mode=OneWay}"/>
</Grid>
</ControlTemplate>