在 Style 中绑定到 HeaderTemplate 内的 Slider 值
Binding to Slider value inside HeaderTemplate in Style
我为 Slider
制作了一个样式,我在其中自定义了 HeaderTemplate
,如下所示:
<Style TargetType="Slider">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding}" Grid.Column="0" />
<TextBlock Text="{Binding Path=Value}" Grid.Column="1" />
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
Header-属性 的绑定工作正常并显示在 TextBlock
和 {Binding}
中。但是我希望 Slider
的 Value
属性 出现在第二个 TextBlock
中,但我找不到办法做到这一点。我曾尝试使用 TemplatedParent
作为源,但它崩溃了,因为它试图在 ContentPresenter
类型的对象上获取 Value
属性。
如何将 Slider
的 Value
属性 绑定到第二个 TextBlock
?
HeaderTemplate 仅获取要使用的 Header 的内容。它看不到 Slider 上的其他属性。由于听起来您的目标是特定的恒定外观,因此您需要使用 HeaderTemplate 吗?如果您将页眉嵌入到滑块的模板中,那么它可以通过 RelativeSource 访问值。
右键单击滑块并选择编辑 Template.Edit 复制...以获取滑块模板的副本。在模板中找到 HeaderContentPresenter 并将其替换为您的 Grid 模板:
<!--<ContentPresenter x:Name="HeaderContentPresenter" ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" Foreground="{ThemeResource SliderHeaderForegroundThemeBrush}" FontWeight="{ThemeResource SliderHeaderThemeFontWeight}" Margin="{ThemeResource SliderHeaderThemeMargin}"/>-->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Header}" Grid.Column="0" />
<TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value}" Grid.Column="1"/>
</Grid>
如果您想进一步自定义页眉,您可以使用 ContentPresenter 而不是 Path=Header TextBlock。
我为 Slider
制作了一个样式,我在其中自定义了 HeaderTemplate
,如下所示:
<Style TargetType="Slider">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding}" Grid.Column="0" />
<TextBlock Text="{Binding Path=Value}" Grid.Column="1" />
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
Header-属性 的绑定工作正常并显示在 TextBlock
和 {Binding}
中。但是我希望 Slider
的 Value
属性 出现在第二个 TextBlock
中,但我找不到办法做到这一点。我曾尝试使用 TemplatedParent
作为源,但它崩溃了,因为它试图在 ContentPresenter
类型的对象上获取 Value
属性。
如何将 Slider
的 Value
属性 绑定到第二个 TextBlock
?
HeaderTemplate 仅获取要使用的 Header 的内容。它看不到 Slider 上的其他属性。由于听起来您的目标是特定的恒定外观,因此您需要使用 HeaderTemplate 吗?如果您将页眉嵌入到滑块的模板中,那么它可以通过 RelativeSource 访问值。
右键单击滑块并选择编辑 Template.Edit 复制...以获取滑块模板的副本。在模板中找到 HeaderContentPresenter 并将其替换为您的 Grid 模板:
<!--<ContentPresenter x:Name="HeaderContentPresenter" ContentTemplate="{TemplateBinding HeaderTemplate}" Content="{TemplateBinding Header}" Foreground="{ThemeResource SliderHeaderForegroundThemeBrush}" FontWeight="{ThemeResource SliderHeaderThemeFontWeight}" Margin="{ThemeResource SliderHeaderThemeMargin}"/>-->
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Header}" Grid.Column="0" />
<TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value}" Grid.Column="1"/>
</Grid>
如果您想进一步自定义页眉,您可以使用 ContentPresenter 而不是 Path=Header TextBlock。