如何将不同的样式应用于ListBox标题和项目

时间:2011-11-22 10:45:47

标签: c# wpf xaml listbox

我有ListBox绑定到我的自定义类

ObservableCollection<FieldPropertyItem> _fieldOrderCollection`;
internal struct FieldPropertyItem
{
  public string Name { get; set; }
  public string AliasName { get; set; }
}

ListBox代码:

<ListBox x:Name="FieldOrderListBox" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" 
         VerticalAlignment="Stretch" HorizontalContentAlignment="Stretch" SelectedIndex="0"
         ScrollViewer.VerticalScrollBarVisibility="Auto" SelectionChanged="FieldOrderListBox_SelectionChanged">
    <ListBox.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="#FF479EF3"></SolidColorBrush>
    </ListBox.Resources>

       <ListBox.ItemTemplate>
        <DataTemplate x:Name="MyTemplate">
            <Grid  Margin="-5,-1,0,0">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="FieldName" MinWidth="5" MaxWidth="300"/>
                    <ColumnDefinition Width="2" />
                    <ColumnDefinition Width="*" MaxWidth="350"/>
                </Grid.ColumnDefinitions>                                

                <Border  BorderBrush="Black" Grid.Column="0" BorderThickness="0.5,0.0,0.5,0.5" IsHitTestVisible="False">
                    <TextBlock Text="{Binding Name}" Grid.Column="0" ToolTip="{Binding Name}" Margin="2,0,2,0" VerticalAlignment="Center"/>
                </Border>
                <GridSplitter Grid.Column="1" Width="2" HorizontalAlignment="Left" Background="Black" Margin="-2,0,-1,0"/>
                <Border BorderBrush="Black" BorderThickness="0,0.0,0.5,0.5" Margin="-2,0,0,0" Padding="0,5,0,0" Grid.Column="2">
                    <TextBlock Text="{Binding AliasName}" Grid.Column="1" ToolTip="{Binding AliasName}" Margin="2,0,2,0" VerticalAlignment="Center" HorizontalAlignment="Stretch"/>
                </Border>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

现在我希望我的ListBox第一项应该看起来像标题。其余的应该有一个昏暗的背景。

2 个答案:

答案 0 :(得分:1)

您可以使用触发器中的null绑定来检查上一项是RelativeSource,例如这个DataTemplate使第一个元素变为粗体:

<DataTemplate>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition SharedSizeGroup="A" />
            <ColumnDefinition SharedSizeGroup="B" />
        </Grid.ColumnDefinitions>
        <Grid.Style>
            <Style TargetType="{x:Type Grid}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData}}" Value="{x:Null}">
                        <Setter Property="TextElement.FontWeight" Value="Bold" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Grid.Style>
        <TextBlock Grid.Column="0" Text="{Binding Name}" />
        <TextBlock Grid.Column="1" Text="{Binding AliasName}" />
    </Grid>
</DataTemplate>

(使用上面显示的共享尺寸组将网格彼此对齐,在Grid.IsSharedSizeGroup元素上将true设置为ListBox

顺便说一句,我不推荐这样做,如果你的项目集合包含标题,那么你的数据设计肯定有问题。

答案 1 :(得分:0)

1。)您可以在FieldPropertyItem上拥有一个新的Property IsFirstItem 每当_fieldOrderCollection更改时,都会确定ObservableCollection中元素的IsFirtItem属性。

2.。)在XAML(Normal和FirstItem Template)中定义相应的模板

3.)然后你可以像这样绑定XAML:

<ListBox ItemsSource="{Binding Items}"  >
  <ListBox.ItemTemplate>
    <DataTemplate>
      <ContentControl x:Name="contentControl" Content="{Binding}" ContentTemplate="{StaticResource normalTemplate}"/>
      <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding Path=IsFirstItem}" Value="True" >
          <Setter TargetName="contentControl" Property="ContentTemplate" Value="{StaticResource firstItemTemplate}"></Setter>
        </DataTrigger>
      </DataTemplate.Triggers>
  </ListBox.ItemTemplate>
</ListBox>