在WPF中使用CollectionViewSource嵌套分组

时间:2017-12-30 09:58:01

标签: wpf

我有一个List组件,它绑定到xaml中的ListBox。 在视图模型中,我尝试使用CollectionViewSource,如下所示:

var groupedItems = CollectionViewSource.GetDefaultView(Components);
groupedItems.GroupDescriptions.Add(new PropertyGroupDescription("Category"));
groupedItems.GroupDescriptions.Add(new PropertyGroupDescription("SubCategory"));

Components集合中的某些对象(T)可以具有空的SubCategory。 现在,当呈现UI时,会出现一个空标题,用于对具有空SubCategory的对象进行分组,如下所示:

Category
   --SubCategory
      --Item 1
      --Item 2
   --              
      --Item 3
      --Item 4
Category
   ......continues

我想要第3项和第3项。第4项没有子类别作为类别的直接子项出现如下:

 Category
       --Item 3
       --Item 4
       --SubCategory
          --Item 1
          --Item 2     

    Category
       ......continues

请指导如何实现这一目标。

此致

Nish26

1 个答案:

答案 0 :(得分:0)

这个答案描述了基于样式选择器的方法。也许,有更好的方法可以获得类似的结果,我会高兴地看着它们。

样式选择器

样式选择器允许基于自定义逻辑应用样式。 以下选择器应检查Name的{​​{1}}是否为CollectionViewGroup并返回相应的样式:

null

值得一提的是,如果样式为public class GroupStyleSelector : StyleSelector { public Style NoGroupHeaderStyle { get; set; } public Style DefaultGroupStyle { get; set; } public override Style SelectStyle(object item, DependencyObject container) { var group = item as CollectionViewGroup; if (group?.Name == null /* or any other condition */) { return NoGroupHeaderStyle; } return DefaultGroupStyle; } } ,则会使用默认样式。因此,设置null

非常重要

XAML

不应显示组标题的NoGroupHeaderStyle样式:

GroupItem

带标题的<Style TargetType="{x:Type GroupItem}" x:Key="NoGroupHeaderStyle"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type GroupItem}"> <ItemsPresenter /> </ControlTemplate> </Setter.Value> </Setter> </Style> 的默认样式。这是可选的。

GroupItem

上面描述的样式选择器:

<Style TargetType="{x:Type GroupItem}" x:Key="DefaultGroupHeaderStyle">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupItem}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <ContentPresenter Grid.Row="0" />
                    <ItemsPresenter Grid.Row="1" Margin="20,0,0,0" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

由于样式选择器提供的自定义样式<local:GroupStyleSelector x:Key="GroupStyleSelector" NoGroupHeaderStyle="{StaticResource NoGroupHeaderStyle}" DefaultGroupStyle="{StaticResource DefaultGroupHeaderStyle}" /> ,对于GroupItemSubCategory的{​​{1}}项目,不显示组标题:

null

排序

要先显示空<ListBox ItemsSource="{Binding GroupedItems}" DisplayMemberPath="ComponentName"> <ListBox.GroupStyle> <GroupStyle ContainerStyleSelector="{StaticResource GroupStyleSelector}"> <GroupStyle.HeaderTemplate> <DataTemplate> <!-- Display the name of CollectionViewGroup --> <TextBlock Text="{Binding Name}" /> </DataTemplate> </GroupStyle.HeaderTemplate> </GroupStyle> </ListBox.GroupStyle> </ListBox> 的项目,应按SubCategory排序:

SubCategory

组件

以下类用作集合中的元素:

CollectionView.SortDescriptions.Add(
    new SortDescription(nameof(Component.SubCategory),
    ListSortDirection.Ascending));