web-dev-qa-db-ja.com

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

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>

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

109
prjndhi

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

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

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

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

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

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

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

  • コンパイル時に評価されます。 (たとえば、Paddingプロパティが存在しなかった場合、コンパイルエラーが発生します。ただし、TemplatedParentでバインディングを使用すると、実行時にのみエラーが表示されます。)
  • 常に一方向のバインディングです。
  • ソースプロパティとターゲットプロパティの両方が依存プロパティであることが必要です。
  • 機能がはるかに少ない(StringFormat、Delay、IsAsyncなどはありません。 Binding vs TemplateBindingExtention のプロパティを参照してください)。
184
Eren Ersönmez

写真は1000語の価値があります。この場合、7分のビデオです: https://www.youtube.com/watch?v=z-0TZR-7xLI

EDIT:例:

  • Buttonには、デフォルトのControlTemplateプロパティとHeightプロパティがあります
  • ControlTemplateButtonプロパティを独自に記述することでオーバーライドします(たとえば、Ellipse- lookingの代わりにRectangle- lookingボタンを作成したい場合)
  • 新しいEllipseControlTemplateを作成した後、Ellipseを元のボタンのHeightプロパティと同じサイズにしたい
  • したがって、名前を付けずにTemplateBindingButtonを参照するには、Heightを使用します enter image description here
48
Bad

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

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

バインド自体は MSDN で説明されています。 これ は非常に素晴らしいチートシートで、実際に私の隣の壁にぶら下がっています。利用可能なすべての異なるバインディングの概要を示します。

32
dowhilefor

From TemplateBinding Markup ExtensionTemplateBindingは、コントロールテンプレート内のプロパティの値を、テンプレート化されたコントロール上の他の公開プロパティの値にリンクします。つまり、テンプレートの値をバインドするためのものです。

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

6
Zabavsky