Silverlight / WPF中的TemplateBinding和ContentPresenter

时间:2010-11-22 01:23:34

标签: wpf silverlight binding

我有一个列表框,其中包含为ItemContainer和ItemTemplate样式定义的模板。

我的ItemTemplate是一个非常简单的DataTemplate:

<DataTemplate x:Key="DataTemplate1">
    <Grid x:Name="grid">
    <TextBlock TextWrapping="Wrap" Text="{Binding}" Foreground="White" FontSize="24" />    
    </Grid>
</DataTemplate>

并且ItemContainer也非常简单:

<Grid x:Name="Grid" HorizontalAlignment="Stretch" Height="Auto" SnapsToDevicePixels="true" Width="373" Background="{x:Null}">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="37"/>
    </Grid.ColumnDefinitions>
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="SelectionStates">
            <VisualState x:Name="Unselected"/>
            <VisualState x:Name="Selected"/>
            <VisualState x:Name="SelectedUnfocused"/>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <ContentPresenter x:Name="contentPresenter" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Stretch" Margin="2,0,0,0" d:LayoutOverrides="Width">
    </ContentPresenter>
    <Image x:Name="image" HorizontalAlignment="Center" Margin="0,0,0,1" Source="/MyApp;component/Images/icon_arrowcircle.png" Stretch="Uniform" Width="37" Grid.Column="1" VerticalAlignment="Center" Opacity="0"/>
</Grid>

一切正常。

但我想要做的是,当选择一个项目(即选择的视觉状态)时,我希望DataTemplate中的TextBlock将其前景颜色更改为黑色而不是白色,并使字体更大。但我似乎无法找到一种干净的方法,因为TemplateBinding似乎无法从DataTemplate中获取。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

如果您希望ItemContainer的模板控制Foreground,您可以在那里设置它而不是在ItemTemplate中。 TextBlock.Foreground和TextBlock.FontSize可用作附加属性,并将从父值继承:

<ContentPresenter TextBlock.Foreground="White" TextBlock.FontSize="18"/>

需要从ItemTemplate中删除这些属性的设置,以避免覆盖继承的值。然后,您可以从VisualState动画中设置所需的任何值。

答案 1 :(得分:0)

不要认为当前的Silverlight版本中的答案已经解决了,ContentPresenter上附加的orpoerties甚至不再构建。其他人都想出来了吗?