XAML 我的WPF样式设定程式可以使用TemplateBinding吗?

xbp102n0  于 2022-12-07  发布在  其他
关注(0)|答案(3)|浏览(153)

我正试着做这样的事...

<Style
    x:Key="MyBorderStyle"
    TargetType="Border">
    <Setter
        Property="Padding"
        Value="{TemplateBinding Padding}" />
</Style>

...但我得到错误:

  • "Padding"成员无效,因为它没有限定得类型名称. *

如何提供"限定类型名称"?
注意:我尝试这样做的原因是,我想在一系列类似的ControlTemplates中包含相同的Border。
我也试过这个:

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

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

  • 无法将属性"Value"中的值转换为""类型的对象。*

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

    • 编辑:**

根据TemplateBinding的文档,它是这样写的:
将控件样板中的属性值链接为样板化控件上其他公开属性的值。
所以听起来我想做的事情是不可能的。我真的希望能够在我的控件模板中为某些控件创建可重用的样式,但是我想模板绑定不能包含在这些样式中。

mfuanj7w

mfuanj7w1#

TemplateBinding适用于模板化控件,并将该控件的属性值绑定到模板中其他控件的属性的情况。在您的情况下,您正在模板化某个对象(称为MyControl),该模板将包括边框,其填充应绑定到MyControl的填充。
MSDN documentation开始:
TemplateBinding是针对模板方案的绑定的优化形式,类似于使用{Binding RelativeSource={RelativeSource TemplatedParent}}构造的绑定。
但是无论出于什么原因,将TemplatedParent指定为绑定的源似乎在样式设置器中不起作用。要解决这个问题,您可以将相对父控件指定为正在模板化的控件的AncestorType(如果您没有在MyControl模板中嵌入其他MyControl,它将有效地找到TemplatedParent)。
我在尝试自订Button控件的样板时,使用了这个方案,其中Button的(String)Content需要系结至按钮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>
3j86kqsm

3j86kqsm2#

{TemplateBinding ...}快捷键在Setter中不可用。
但没有人会阻止您使用完整的详细版本,例如:
Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Padding}" .

r7knjye2

r7knjye23#

只要在属性前面加上型别名称,就可以限定属性。例如,Border.Padding取代Padding
但是,我不确定这对您的场景是否有意义。TemplateBinding在控件模板中使用。

相关问题