listview条件分组

时间:2016-01-22 10:35:12

标签: c# wpf listview grouping

在我的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是否可行?

1 个答案:

答案 0 :(得分:1)

我能够使用以下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>

您可能需要额外注意扩展器样式和datatemplates,以使其看起来相似。