C# 我可以使用包装来组织ListView组标题吗?

C# 我可以使用包装来组织ListView组标题吗?,c#,wpf,containers,wrappanel,C#,Wpf,Containers,Wrappanel,我想能够使用WrapPanel按组头而不是按项进行包装 我已经为绑定到ObservableCollection学生列表的ListView实现了以下ICollectionView视图: view = CollectionViewSource.GetDefaultView(studentlist); view.GroupDescriptions.Add(new PropertyGroupDescription("sectionoutput"));

我想能够使用WrapPanel按组头而不是按项进行包装

我已经为绑定到ObservableCollection
学生列表的ListView实现了以下ICollectionView
视图

        view = CollectionViewSource.GetDefaultView(studentlist);
        view.GroupDescriptions.Add(new PropertyGroupDescription("sectionoutput"));
        view.SortDescriptions.Add(new SortDescription("sectionoutput", ListSortDirection.Ascending));
        view.SortDescriptions.Add(new SortDescription("displayname", ListSortDirection.Ascending));
XAML包含一个样式资源,用于设置组标题的模板:

    <Style x:Key="ContainerStyle" TargetType="{x:Type GroupItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                        <Expander Header="{Binding Name}" IsExpanded="{Binding Name, Mode=OneWay, Converter={StaticResource expanderconverter}}">
                            <ItemsPresenter />
                        </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

此样式用作ListView的组样式:

    <ListView ScrollViewer.HorizontalScrollBarVisibility="Disabled">            
        <ListView.GroupStyle>
            <GroupStyle ContainerStyle="{StaticResource ContainerStyle}"/>
        </ListView.GroupStyle>
...
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding displayname}">
                </TextBlock>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

...
按原样,代码显示了一个学生姓名的垂直列表,该列表由一个标题分组,标题列出了学生的科号。但我想按水平方向顺序列出这些组

我知道我能够使用包装来组织ListView中的项目:

        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Orientation="Horizontal" ItemWidth="150">                        
                </WrapPanel>
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>

但这段代码只是并排显示组中的学生,而不是并排显示组本身。我想做的是让小组自己水平包装。我曾尝试在样式资源中实现一个包装面板,但没有成功,我一直在想是否有一种按组包装的方法


我想可以通过切换到树状视图并将组转换为项目来实现这一点。但是如果可能的话,我更愿意使用ListView,因为我的程序实现了一个以ListView为参数的类。

假设有一个
ViewModel
,它是下面发布的XAML的数据上下文,包含一个名为
GroupsViewModel
ObservableCollection

GroupViewModel
只有一个名为
GroupName
的属性,该属性是要显示的组的名称,它的属性为
observeCollection

StudentViewModel
具有属性
displayName
以显示学生的姓名

也就是说,通过使用
扩展器
和两个嵌套的
列表框
,您可以得到所需的内容,如以下代码:

<ListBox ItemsSource="{Binding GroupsViewModel}">
<ListBox.ItemTemplate>
    <DataTemplate>
        <Grid>
            <Expander HorizontalAlignment="Left" IsExpanded="True" Header="{Binding GroupName}">
                <ListBox ItemsSource="{Binding StudentViewModel}" HorizontalAlignment="Left">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding displayname}" />
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Vertical"></StackPanel>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                </ListBox>
            </Expander>
        </Grid>
    </DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <StackPanel Orientation="Horizontal"></StackPanel>
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>

GroupStyle
有一个
面板
属性,您可以使用
WrapPanel将该属性设置为
ItemsPanelTemplate

<ListView.GroupStyle>
    <GroupStyle ContainerStyle="{StaticResource ContainerStyle}">
        <GroupStyle.Panel>
            <ItemsPanelTemplate>
                <WrapPanel />
            </ItemsPanelTemplate>
        </GroupStyle.Panel>
    </GroupStyle>
</ListView.GroupStyle>

谢谢!我想我试过这样做,但我的语法错了。我对WPF还是新手,但我真的很喜欢它的数据绑定特性。