【发布时间】:2020-10-14 08:16:15
【问题描述】:
我希望能够使用 WrapPanel 按组标题而不是按项目进行包装。
我已经为绑定到 ObservableCollection studentlist 的 ListView 实现了以下 ICollectionView view:
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>
这个 Style 被用作 ListView 的 GroupStyle:
<ListView ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListView.GroupStyle>
<GroupStyle ContainerStyle="{StaticResource ContainerStyle}"/>
</ListView.GroupStyle>
...
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding displayname}">
</TextBlock>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
按原样,代码显示了学生姓名的垂直列表,这些学生姓名按标题分组,列出了他们的部分编号。但我想在水平方向上按顺序列出这些组。
我知道我可以使用 WrapPanel 组织 ListView 中的项目:
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" ItemWidth="150">
</WrapPanel>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
但此代码仅并排显示组中的学生,而不是并排显示组本身。我想做的是让这些组本身水平包裹。我试图在样式资源中实现一个换行面板,但我没有成功,一直想知道是否有办法按组换行。
我认为可以通过切换到 TreeView 并将组转换为项目来做到这一点。但如果可能的话,我更愿意使用 ListView,因为我的程序实现了一个将 ListView 作为参数的类。
【问题讨论】:
标签: c# wpf containers wrappanel