列表视图条件分组

本文关键字:条件 视图 列表 | 更新日期: 2023-09-27 18:31:23

在我的WPF应用程序中,我有一ListView包含部分分组的文档:

myitems.Add(new Data("document_1", "section_1"));
myitems.Add(new Data("document_1", "section_2"));
myitems.Add(new Data("document_2", "one_and_only_section"));
lv.ItemsSource = myitems;
CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lv.ItemsSource);
view.GroupDescriptions.Clear();
view.GroupDescriptions.Add(new PropertyGroupDescription("document");

这导致大致看起来像

< document_1
     section_1
     section_2
< document_2
     one_and_only_section

这在理论上很好,但如果所有内容都折叠了,选择"one_and_only_section"项是非常乏味的,因为它需要两次单击(第一次单击"document_2",第二次单击"one_and_only_section")。理想情况下,document_2不应以与document_1相同的方式分组:

< document_1
     section_1
     section_2
document_2

因此,如果一个组中只有一个元素,它不应该有一个扩展器并显示该元素。如果选中,它应该像选择了"one_and_only_section"一样。

这在ListView可行吗?

列表视图条件分组

我能够使用以下 XAML 代码生成所需的输出:

<ListView ItemsSource="{Binding Path=ItemsView}">
        <ListView.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <ControlTemplate.Resources>
                                        <DataTemplate DataType="{x:Type local:ItemViewModel}">
                                            <TextBlock Text="{Binding Path=Section}" />
                                        </DataTemplate>
                                    </ControlTemplate.Resources>
                                    <Expander Background="{DynamicResource {x:Static SystemColors.ControlLightLightBrushKey}}">
                                        <Expander.Header>
                                            <StackPanel Margin="0,8,0,0"
                                                        HorizontalAlignment="Stretch"
                                                        Orientation="Horizontal">
                                                <TextBlock x:Name="Title"
                                                           VerticalAlignment="Center"
                                                           FontWeight="Bold">
                                                    <Run Text="{Binding Path=Name, Mode=OneWay}" />
                                                    <Run Text=" " />
                                                    <Run Text="{Binding Path=Items.Count, Mode=OneWay}" />
                                                </TextBlock>
                                            </StackPanel>
                                        </Expander.Header>
                                        <ItemsPresenter />
                                    </Expander>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=Items.Count}" Value="1">
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="{x:Type GroupItem}">
                                            <ControlTemplate.Resources>
                                                <DataTemplate DataType="{x:Type local:ItemViewModel}">
                                                    <TextBlock Text="{Binding Path=Document}" />
                                                </DataTemplate>
                                            </ControlTemplate.Resources>
                                            <ItemsPresenter />
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </ListView.GroupStyle>
    </ListView>

您可能希望对扩展器样式和数据模板添加一些额外的关注,以使其看起来相似。