C# 我可以使用包装来组织ListView组标题吗?
我想能够使用WrapPanel按组头而不是按项进行包装 我已经为绑定到ObservableCollectionC# 我可以使用包装来组织ListView组标题吗?,c#,wpf,containers,wrappanel,C#,Wpf,Containers,Wrappanel,我想能够使用WrapPanel按组头而不是按项进行包装 我已经为绑定到ObservableCollection学生列表的ListView实现了以下ICollectionView视图: view = CollectionViewSource.GetDefaultView(studentlist); view.GroupDescriptions.Add(new PropertyGroupDescription("sectionoutput"));
学生列表的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还是新手,但我真的很喜欢它的数据绑定特性。