代码之家  ›  专栏  ›  技术社区  ›  devuxer

我的wpf样式设置器可以使用模板绑定吗?

  •  19
  • devuxer  · 技术社区  · 15 年前

    我想做这样的事…

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

    如何提供“限定类型名”?

    注意:我尝试这样做的原因是,我希望在一系列类似的控件模板中包含相同的边框。

    谢谢。

    编辑:

    我试过了…

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

    …它实际上是编译的,但是当我运行应用程序时,我得到了一个 XamlParseException :

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

    我想可能是资格赛 Padding 具有 GridViewColumnHeader (这是我要使用的控件模板)可以,但没有骰子。

    编辑2:

    好吧,根据文件 TemplateBinding 它说:

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

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

    2 回复  |  直到 8 年前
        1
  •  34
  •   Shane Arney    14 年前

    对于模板化控件并且希望将该控件的属性值绑定到模板内其他控件的属性的情况,应该可以这样做。在您的示例中,您要对某些内容进行模板化(称为mycontrol),并且该模板将包含一个边框,其填充应绑定到mycontrol的填充。

    MSDN documentation :

    模板绑定是模板方案绑定的优化形式,类似于使用binding relativesource=relativesource templatedParent构造的绑定。

    无论出于什么原因,将templatedParent指定为绑定的源似乎在样式设置器中不起作用。为了避免这种情况,您可以将相对父对象指定为要模板化的控件的AncestorType(如果您没有在MyControl模板中嵌入其他MyControl,则可以有效地查找模板化父对象)。

    我在尝试自定义按钮控件模板时使用了此解决方案,其中按钮的(字符串)内容需要绑定到按钮的ControlTemplate中的文本块的文本属性。下面是代码的样子:

    <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>
    
        2
  •  3
  •   Tim Cooper    13 年前

    只需在属性前面加上类型名就可以对其进行限定。例如, Border.Padding 而不是 Padding .

    不过,我不确定这是否适合你的场景。 TemplateBinding s在控件模板内使用。