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

谢谢。

编辑:

嗯,我试过这个...

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

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

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

我想也许有资格Padding使用GridViewColumnHeader(这是我想使用这种风格的 ControlTemplate)会起作用,但没有骰子。

编辑2:

好吧,根据文档TemplateBinding,它说:

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

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

4

3 回答 3

39

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

MSDN 文档

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

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

当我尝试自定义模板按钮控件时,我使用了此解决方案,其中按钮的(字符串)内容需要绑定到按钮的 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>
于 2010-06-22T16:46:33.413 回答
3

可以简单地通过在其前面加上类型名称来限定属性。例如,Border.Padding代替Padding.

但是,我不确定这对您的方案是否有意义。TemplateBindings 在控制模板中使用。

于 2009-08-29T15:36:37.630 回答
3

当然是,

{TemplateBinding ...}快捷方式在 Setter 中不可用。

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

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

于 2020-02-12T18:17:54.787 回答