【问题标题】:Binding to Slider value inside HeaderTemplate in Style在样式中绑定到 HeaderTemplate 中的 Slider 值
【发布时间】:2015-03-24 11:40:34
【问题描述】:

我为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-property 的绑定工作正常,并显示在 TextBlock{Binding} 中。但我希望SliderValue 属性出现在第二个TextBlock 中,但我找不到这样做的方法。我曾尝试使用TemplatedParent 作为源,但由于它试图获取ContentPresenter 类型的对象上的Value 属性而崩溃。

如何将SliderValue 属性绑定到第二个TextBlock

【问题讨论】:

  • 我会创建一个带有 Slider Value 属性的快速 ViewModel 并绑定到它。我不认为 ElementName 在这种情况下会起作用

标签: windows xaml windows-store-apps


【解决方案1】:

HeaderTemplate 仅获取要使用的 Header 的内容。它看不到 Slider 上的其他属性。由于听起来您的目标是特定的恒定外观,因此您需要使用 HeaderTemplate 吗?如果您将 Header 嵌入到 Slider 的模板中,那么它可以通过 RelativeSource 访问 Value。

右键单击滑块并选择编辑模板。编辑副本...以获取滑块模板的副本。在模板中找到 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>

如果您希望进一步自定义 Header,您可以使用 ContentPresenter 而不是 Path=Header TextBlock。

【讨论】:

  • 行得通,谢谢!我认为这似乎有点矫枉过正,我需要有一个完整的模板副本,但我想这是需要的吗?有没有办法只替换HeaderContentPresenter,没有所有的视觉状态码等?
猜你喜欢
  • 2011-11-21
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2023-04-02
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
相关资源
最近更新 更多