10

BorderThickness.Top のような構造要素を TemplatedParent の対応するプロパティにバインドすることは可能でしょうか。私が試してみました

<Border Margin="0" Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}">
    <Border.BorderThickness>
        <Thickness Left="0" Right="0" Top="{TemplateBinding BorderThickness.Top}" Bottom="{TemplateBinding BorderThickness.Bottom}"/>
    </Border.BorderThickness>
</Border>

これを行う理由は、Left と Right を 0 にして、Top と Bottom だけをバインドしたいからです。

前もって感謝します。

4

2 に答える 2

15

Thickness は値型であるため、これは不可能です。依存関係オブジェクトの依存関係プロパティに対してのみバインディングを作成できます。

できることは、BorderThickness を通常どおりバインドすることです。

<Border Margin="0" 
        Padding="{TemplateBinding Padding}" 
        BorderBrush="{TemplateBinding BorderBrush}"
        BorderThickness="{TemplateBinding BorderThickness, Converter={StaticResource ThicknessConverter}}" />

次にコンバーターを使用して、適切に変更された Thickness を返します。

object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture )
{
    var thickness = (Thickness) value;
    return new Thickness( 0.0, thickness.Top, 0.0, thickness.Bottom );
}

ConverterParameter を使用して、Thickness のどの部分をクリアするかを指定することもできます。

于 2009-09-08T09:14:00.510 に答える
1

コンバーターを使用したソリューションは正しいものです。

1 つの値のみに関心がある場合は、コンバーターを使用せずにXAMLで直接これを行うことができます。機能が制限された構文糖衣にすぎません。{TemplateBinding …}{Binding RelativeSource={RelativeSource TemplatedParent} …}

たとえば、いくつかのカスタム ボーダー:

<Button BorderBrush="Purple"
        BorderThickness="1 2 3 4"
        Content="This is a button!">
    <Button.Template>
        <ControlTemplate TargetType="{x:Type Button}">
            <DockPanel>
                <Rectangle DockPanel.Dock="Left"
                           Width="{Binding BorderThickness.Left, RelativeSource={RelativeSource TemplatedParent}}"
                           Fill="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}}" />
                <Rectangle DockPanel.Dock="Top"
                           Height="{Binding BorderThickness.Top, RelativeSource={RelativeSource TemplatedParent}}"
                           Fill="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}}" />
                <Rectangle DockPanel.Dock="Right"
                           Width="{Binding BorderThickness.Right, RelativeSource={RelativeSource TemplatedParent}}"
                           Fill="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}}" />
                <Rectangle DockPanel.Dock="Bottom"
                           Height="{Binding BorderThickness.Bottom, RelativeSource={RelativeSource TemplatedParent}}"
                           Fill="{Binding BorderBrush, RelativeSource={RelativeSource TemplatedParent}}" />
                <ContentPresenter />
            </DockPanel>
        </ControlTemplate>
    </Button.Template>
</Button>
于 2017-03-25T14:01:19.530 に答える