我的WPF样式设置器可以使用TemplateBinding吗?

时间:2009-08-29 14:58:32

标签: wpf xaml styles templatebinding

我正在尝试这样做......

<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中包含相同的Border。

感谢。

修改

我试过这个......

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

...它实际上已编译,但是当我运行应用程序时,我得到了XamlParseException

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

我认为使用Padding(这是我希望使用此样式的ControlTemplate)可以使GridViewColumnHeader符合条件,但是没有骰子。

编辑2:

嗯,根据TemplateBinding的文档,它说:

  

将控件模板中属性的值链接为模板化控件上某些其他公开属性的值。

所以听起来我正在尝试做的事情显然是不可能的。我真的希望能够为我的控件模板中的某些控件创建可重用的样式,但我想模板绑定不能包含在这些样式中。

3 个答案:

答案 0 :(得分:36)

这适用于您正在模板控件并且您希望将该控件的属性值绑定到模板内不同控件的属性的情况。在你的情况下,你是模板化的东西(称之为MyControl),该模板将包含一个边框,其Padding应绑定到MyControl的填充。

来自MSDN documentation

  

TemplateBinding是模板场景绑定的优化形式,类似于使用{Binding RelativeSource = {RelativeSource TemplatedParent}}构造的Binding。

无论出于何种原因,将TemplatedParent指定为绑定源似乎在样式设置器中不起作用。为了解决这个问题,您可以将相对父项指定为您正在模板化的控件的AncestorType(如果您没有在MyControl模板中嵌入其他MyControl,则可以有效地找到TemplatedParent)。

当我尝试自定义模板一个Button控件时,我使用了这个解决方案,其中Button的(String)内容需要绑定到ControlTemplate中按钮的TextBlock的Text属性。这是代码的样子:

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

答案 1 :(得分:3)

只需在类型名称前加上属性即可对属性进行限定。例如,Border.Padding代替Padding

但是,我不确定它对你的场景有意义。 TemplateBinding用于控件模板中。

答案 2 :(得分:0)

是的,

设置器中没有{TemplateBinding ...}快捷方式。

但是没有人会阻止您使用完整的详细版本。

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