如何更改部分datatemplate背景

时间:2013-04-23 08:19:39

标签: wpf listbox datatemplate

我有一个ListBox,它的DateTemplate是这样的:

<Grid Margin="30,0,0,0" HorizontalAlignment="Left">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <Image Source="{Binding Path=IconSource}"/>
                <TextBlock Grid.Column="1" Background="{x:Null}" Text="{Binding Path=DisplayText, Mode=Default}" Foreground="Black"/>
            </Grid>

这是ItemContainerStyle:

 <Style x:Key="Test" TargetType="ListBoxItem">
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <Border Name="Border" SnapsToDevicePixels="True">
                        <ContentPresenter/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter TargetName="Border" Property="Background" Value="Blue" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

当选择一个ListBoxItem时,是否可以不设置图像的背景? 就像在VS的Intellisense中一样,API的图标也没有背景。

2 个答案:

答案 0 :(得分:1)

我不完全确定这是否是您的意思,但我建议不使用数据模板,而是使用项容器控件模板的元素进行所有必要的数据绑定。这是可能的,因为项容器和数据模板实际上共享相同的数据上下文。如果是ListBoxItem,则看起来像这样:

<ControlTemplate x:Key="ListBoxItemTemplate" TargetType="ListBoxItem">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Image Source="{Binding IconSource}" Height="50" Margin="0,0,5,0"/>
        <Border x:Name="Border" VerticalAlignment="Center" Grid.Column="1">
            <TextBlock Text="{Binding Name}" />
        </Border>
    </Grid>
      <ControlTemplate.Triggers>
          <Trigger Property="IsSelected" Value="true">
              <Setter TargetName="Border" Property="Background" Value="Blue" />
          </Trigger>
      </ControlTemplate.Triggers>

</ControlTemplate>

您可以在ItemsContainerStyle上设置的ListBox中引用此模板。

总结:不要使用数据模板,而是将其合并到ItemContainerStyle中。因此,您可以保持Image元素的背景不变。

希望这有帮助。

答案 1 :(得分:1)

最简单的方法是将您的图片放在另一个Grid内,并将网格Background设置为您希望图片具有的背景颜色 - 然后在您更改{时父亲Background的{​​1}},图片的父网格将保护其免受背景颜色变化的影响。