テンプレートバインディングとバインディングは何ですか?


118

理解できませんでしたBorderThickness="{TemplateBinding BorderThickness}。ここにコード:

<ControlTemplate TargetType="{x:Type wpftoolkit:DataGridCell}">
    <Border Padding="{TemplateBinding Padding}" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            BorderThickness="{TemplateBinding BorderThickness}" 
            Background="{TemplateBinding Background}" 
            SnapsToDevicePixels="True">
        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
    </Border>
</ControlTemplate>

他の種類のバインディングについても説明してください。


なぜこれが返され、なぜBorderThicknessが2回「 "" BorderThickness = "{TemplateBinding BorderThickness}" "」を
書き込むのか

1
@Euphoricこのページは、そのクエリに対する最初のgoogleの結果のようです。;)
ANeves 2014年

回答:


204

TemplateBindingは、テンプレート定義内の要素プロパティへのバインドに使用されます。あなたの例では、あなたは書くことができたでしょう

 <Border Padding="{Binding Padding}" ...>

境界線のパディングプロパティを...のパディングプロパティにバインドすることを意味します。「このテンプレートが使用されているコントロールのパディングプロパティ」と言いたいです。現時点では、コントロールのx:Nameがわからないため、名前を付けることはできません(知っていたとしても、別の名前スコープにあるため、機能しません)。ただし、相対ソースを定義することでこれを行うことができます

<Border Padding="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}" ...>

または上記のショートカット(*)であるTemplateBindingを使用します

<Border Padding="{TemplateBinding Padding}" ...>

(*)これらのテンプレートシナリオでは冗長性が低いだけでなく、TemplateBindingには通常のバインディングと比べていくつかの違いがあります。

  • コンパイル時に評価されます。(たとえば、Paddingプロパティが存在しない場合、コンパイルエラーが発生します。ただし、TemplatedParentでバインディングを使用すると、実行時にのみエラーが表示されます。)
  • 常に一方向のバインディングです。
  • ソースプロパティとターゲットプロパティの両方が依存関係プロパティである必要があります
  • それははるかに少ない機能(無StringFormat、遅延、のisAsync、など。の特性を見ているバインディングTemplateBindingExtentionを)。

58

写真は千の言葉に値します。この場合は7分のビデオです:https : //www.youtube.com/watch?v=z-0TZR-7xLI

編集: 例:

  • A ButtonにはデフォルトのControlTemplateプロパティとHeightプロパティがあります
  • 独自のControlTemplateプロパティを上書きしてButton(たとえば、Ellipse-lookingではなく-lookingボタンを作成したいRectangle
  • Ellipse新しいControlTemplateでを作成した後、をEllipse元のButtonのHeightプロパティと同じサイズにする必要があります
  • あなたが使用してTemplateBinding参照するためにButton「S Height名前を付けずにここに画像の説明を入力してください

これにより理論的には質問に答えることができますが、ここに答えの本質的な部分を含め、参照用のリンクを提供することが望ましいでしょう
Bhargav Rao

32

ErenErsönmenzはすでにかなりよく説明していますが、概念をよりよく理解するために別の視点を与えたいと思います。

WPFでは、すべてのコントロールがプレゼンテーションから分離されています。コントロールのテンプレートをいつでも変更して、完全に異なる外観にすることができます。ボタンControlTemplateは、Rectangleたとえばのみで構成されている場合に期待どおりに機能します。ここControlTemplateで、コントロールのロジック部分のプロパティを実際に使用する必要がある場合があります。そして、何のthats TemplateBindingそれだけで伝えるためのものですControlTemplate「私たちは視覚的なプレゼンテーションを与えているコントロールのこのプロパティを使用してください」。良い例は、Backgroundすべてのコントロールのプロパティです。それ自体では意味がなく、それによってのTemplateBinding子コントロールに意味が与えられControlTemplateます。

それ自体でのバインドは、MSDNで非常によく説明されていますこれは非常に素晴らしいチートシートで、実際には私の隣の壁に掛けられています。利用可能なすべての異なるバインディングの概要がわかります。


6

TemplateBindingのマークアップ拡張機能TemplateBindingテンプレートコントロールにいくつかの他の公開されたプロパティの値にコントロールテンプレートのプロパティの値をリンクします。つまり、テンプレートの値をバインドするためのものです。

バインディングは、バインディングターゲットとデータソースのプロパティを接続します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.