24

私はこのようなことをしようとしています...

<Style
    x:Key="MyBorderStyle"
    TargetType="Border">
    <Setter
        Property="BorderBrush"
        Value="{StaticResource MyBorderBrush}" />
    <Setter
        Property="Background"
        Value="{StaticResource MyBackgroundBrush}" />
    <Setter
        Property="Padding"
        Value="{TemplateBinding Padding}" />
</Style>

...しかし、エラーが発生します:'Padding' member is not valid because it does not have a qualifying type name.

「修飾型名」を指定するにはどうすればよいですか?

注:これを実行しようとしている理由は、一連の同様のControlTemplatesに同じ境界線を含めたいためです。

ありがとう。

編集:

さてこれを試してみました...

<Setter
    Property="Padding"
    Value="{TemplateBinding GridViewColumnHeader.Padding}" />

...そしてそれは実際にコンパイルされました、しかしそれから私がアプリを実行したとき、私はXamlParseException:を手に入れました

Cannot convert the value in attribute 'Value' to object of type ''.

おそらく(このスタイルを使用したいControlTemplateである)で修飾Paddingすることは機能すると思いましたが、サイコロは機能しません。GridViewColumnHeader

編集2:

まあ、のドキュメントによるとTemplateBinding、それは言う:

コントロールテンプレートのプロパティの値を、テンプレート化されたコントロールの他の公開されたプロパティの値にリンクします。

ですから、私がやろうとしていることはまったく不可能のように思えます。コントロールテンプレートの特定のコントロールに再利用可能なスタイルを作成できるようにしたいのですが、テンプレートバインディングをこれらのスタイルに含めることはできないと思います。

4

3 に答える 3

39

これは、コントロールをテンプレート化していて、そのコントロールのプロパティの値をテンプレート内の別のコントロールのプロパティにバインドする場合に機能するはずです。あなたの場合、何かをテンプレート化していて(MyControlと呼びます)、そのテンプレートには、そのパディングをMyControlのパディングにバインドする必要がある境界線が含まれます。

MSDNドキュメントから:

TemplateBindingは、テンプレートシナリオ用のバインディングの最適化された形式であり、{Binding RelativeSource ={RelativeSourceTemplatedParent}}で構築されたバインディングに類似しています。

何らかの理由で、バインディングのソースとしてTemplatedParentを指定しても、スタイルセッター内では機能しないようです。これを回避するには、相対的な親をテンプレートのコントロールのAncestorTypeとして指定できます(これにより、MyControlテンプレートに他のMyControlが埋め込まれていない場合は、TemplatedParentが効果的に検出されます)。

このソリューションを使用したのは、ボタンの(文字列)コンテンツをボタンのControlTemplateのTextBlockのTextプロパティにバインドする必要があるButtonコントロールをカスタムテンプレート化しようとしたときです。そのコードは次のようになりました。

<StackPanel>
    <StackPanel.Resources>
        <ControlTemplate x:Key="BarButton" TargetType="{x:Type Button}">
            <ControlTemplate.Resources>
                <Style TargetType="TextBlock" x:Key="ButtonLabel">
                    <Setter Property="Text" Value="{Binding Path=Content, RelativeSource={RelativeSource AncestorType={x:Type Button}} }" />
                </Style>
            </ControlTemplate.Resources>
            <Grid>
                <!-- Other controls here -->
                <TextBlock Name="LabelText" Style="{StaticResource ButtonLabel}" />
            </Grid>
        </ControlTemplate>
    </StackPanel.Resources>
    <Button Width="100" Content="Label Text Here" Template="{StaticResource BarButton}" />
</StackPanel>
于 2010-06-22T16:46:33.413 に答える
3

プロパティの前にタイプ名を付けるだけで、プロパティを修飾できます。たとえば、のBorder.Padding代わりにPadding

ただし、それがあなたのシナリオに適しているかどうかはわかりません。TemplateBindingsはコントロールテンプレート内で使用されます。

于 2009-08-29T15:36:37.630 に答える
3

はい、間違いなく、

{TemplateBinding ...}ショートカットはセッターでは使用できません。

しかし、完全な冗長バージョンの使用を止める人は誰もいません。

例:Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Padding}"

于 2020-02-12T18:17:54.787 に答える