将页面标题绑定到样式中的文本块

时间:2009-08-24 18:54:18

标签: wpf xaml binding styles

好的,我已经为导航窗口定义了一种样式。我已经成功设置了导航按钮的样式,甚至还在页面导航菜单中添加了页面痕迹。我想要的是在面包屑旁边添加页面标题:

Style x:Key="{x:Type NavigationWindow}" TargetType="NavigationWindow">
    <Setter Property="SnapsToDevicePixels" Value="true"/>
        <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="NavigationWindow">
                <DockPanel Background="{StaticResource WindowBackgroundBrush}">
                ...
                <Grid>
            <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition Width="16"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
        ....
        <StackPanel Grid.Column="4" Orientation="Horizontal">
                        <TextBlock Foreground="Gray"
                                   VerticalAlignment="Center"
                                   Text="{Binding Path=Title,
                                                  RelativeSource={RelativeSource FindAncestor, 
                                                  AncestorType={x:Type Page}}}" />
                    </StackPanel>
                </Grid>
            </DockPanel>
    ...
        </ControlTemplate>
    </Setter.Value>
</Setter>

绑定不适用于最后一个TextBlock。 (但是如果没有在样式中使用它可以正常工作,但在常规的XAML页面代码隐藏中)我不知道为什么。救命?如何让它显示当前页面标题?谢谢。

1 个答案:

答案 0 :(得分:0)

问题是在ControlTemplate内,没有Page类型的祖先。 将模板应用于的控件可能具有类型为Page的祖先,但ControlTemplate本身并不知道。它只知道它自己的逻辑树中的祖先。

为了帮助缓解此问题,WPF设计人员添加了TemplateBinding标记扩展,允许您将模板化控件上的属性值应用于控件模板中的属性。

因此,在NavigationWindow上,您应该创建一个公开Title Page的属性。然后,您可以使用以下标记绑定到它:

Text="{TemplateBinding TitleProperty}"