1. ホーム
  2. wpf

[解決済み] テンプレートバインディングとバインディングとは?

2022-08-07 05:05:15

質問

理解できなかったこと 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>

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

どのように解決するのですか?

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

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

...つまり、ボーダーのpaddingプロパティと...のpaddingプロパティを結合する。 は何ですか? あなたは、"このテンプレートが使用されているコントロールのpaddingプロパティ、と言いたいのでしょう。現時点ではコントロールのx:Nameが分からないので、名前を付けることはできません(たとえ分かったとしても、それは異なるネームスコープにあるのでうまくいきません)。しかし、相対的なソースを定義することによって、これを行うことができます。

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

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

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


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

  • それはコンパイル時に評価されます。(たとえば、Padding プロパティが存在しない場合、コンパイル エラーが発生します。しかし、TemplatedParentを使用したバインディングを使用していた場合、実行時にしかエラーは表示されません)。
  • 常に一方向のバインディングです。
  • これは、ソースとターゲットの両方のプロパティが 依存性プロパティ .
  • これは、はるかに少ない機能を持っています (StringFormat, Delay, IsAsync などはありません。 バインディング vs テンプレートバインディングエクステンション ).