如何将TemplateBind绑定到BorderThickness.Top(或Bottom或Left或Right)?

时间:2009-09-08 08:43:47

标签: wpf binding templatebinding thickness

我想知道是否可以将像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>

我想要这样做的原因是我希望左和右为0并且只有顶部和底部被绑定。

提前致谢。

2 个答案:

答案 0 :(得分:15)

这是不可能的,因为Thickness是一个值类型 - 您只能在依赖项对象的依赖项属性上创建绑定。

你可以做的是正常绑定BorderThickness:

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

然后使用转换器返回适当修改的厚度:

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指定要清除厚度的哪些部分。

答案 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>