如何获取组中的第一个ListBoxItem

时间:2014-06-05 13:00:51

标签: c# wpf sorting datatemplate

我有一个ListBox按SortDescriptionGroupDescription排序和分组,现在我想知道是否有办法知道哪个项目是每个组中的第一个项目。例如,如果我有一个名单列表,我想获得列表中以A,B,C等开头的第一个项目并更改其模板。

为了更清楚,我应该说我想要更改每个组中第一个ListBoxItem的DataTemplate。怎么可能?

修改

这是我的示例CollectionView

<CollectionViewSource
x:Key="Myiew"
Source="{Binding Items}">
    <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="FirstName" Converter="{StaticResource StringToFirstLetter}" />
    </CollectionViewSource.GroupDescriptions>
    <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="FirstName" />
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

<Listbox ItemsSource={"StaticResources Myiew"} />

正如我所说,一切正常。项目已排序,如果我更改GroupStyle,我看到项目已分组,但我不想设置组样式。我只想更改每组中第一项的DataTemplate。

1 个答案:

答案 0 :(得分:1)

以下是您的示例

  • 创建转换器类

这将只看到传递的值是否为空

class FirstItemDetector : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
       return value == null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

然后是转换器的声明,其中l:是转换器类的命名空间

<l:FirstItemDetector x:Key="FirstItemDetactor" />

然后是列表框

  • 我添加了一个组样式(你可以随意设置样式)解决方案是独立于群组的
  • 将数据模板添加为列表框的ItemTemplate
  • 在PreviousData上添加了一个DataTrigger,转换为FirstItemDetactor,如上所述
  • 在触发器的设置器中我将前景改为红色(你有很多选择,包括改变样式,显示隐藏元素等。

这是列表框

    <ListBox ItemsSource="{Binding Source={StaticResource Myiew}}">
        <ListBox.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <Grid>
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="auto" />
                                            <RowDefinition />
                                        </Grid.RowDefinitions>
                                        <Border BorderBrush="Black"
                                                BorderThickness=".5"
                                                Padding="4">
                                            <TextBlock Text="{Binding Name}"
                                                       HorizontalAlignment="Center" />
                                        </Border>
                                        <ItemsPresenter Grid.Row="1" />
                                    </Grid>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </ListBox.GroupStyle>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}" x:Name="text" />
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource PreviousData},Converter={StaticResource FirstItemDetactor}}"
                                 Value="True">
                        <Setter TargetName="text"
                                Property="Foreground"
                                Value="Red" />
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

主要角色由datatigger和转换器扮演,它将独立工作,具有组甚至嵌套组。