我有一个ListBox,由分组数据填充,下面是标题和子项 - 我想自定义控件,使每个组标题都是Expander(最初关闭)并展开它会显示该组下面的项目
我还是WPF的新手,所以我该怎么做?我是否需要为GroupStyle的HeaderTemplate实现数据模板(这里是否包含ItemsPresenter?)和ItemTemplate,还是需要创建一个全新的ControlTemplate以及两个数据模板?
另外,使用Expander for headers会禁用ListBox的项目虚拟化功能吗?如果是这样,我该怎么做才能确保不会发生这种情况?如果我将VirtualizingStackPanel放在Expander内容中,是否会缓解这种情况还是不必要?
我的分组非常简单,只是一个字段上的扁平集合:
ICollectionView collegeView = new ListCollectionView(playerDatabase);
collegeView.GroupDescriptions.Add(new PropertyGroupDescription("CollegeName"));
collegeView.SortDescriptions.Add(new SortDescription("CollegeName", ListSortDirection.Ascending));
collegeView.SortDescriptions.Add(new SortDescription("FirstName", ListSortDirection.Ascending));
lstCollege.ItemsSource = collegeView;
更新 这是我到目前为止所尝试的:
<ListBox x:Name="lstCollege" IsSynchronizedWithCurrentItem="True">
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<Border Background="Blue" CornerRadius="5">
<Expander Header="{Binding Path=Name}" FontWeight="Bold" Foreground="White" Padding="3">
<ItemsPresenter />
</Expander>
</Border>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListBox.GroupStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} {1}">
<Binding Path="FirstName" />
<Binding Path="LastName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
不幸的是,这呈现的是每个组的扩展器,但是项目不会在其中呈现 - 它们被呈现在组项目之外并且扩展器是空的
我认为发生这种情况的原因是因为GroupItem是与ListItem(或其他任何名称)分开呈现的,因此ListViewItem不包含在每个GroupItem中......我认为ListBox呈现它的方式是GroupItem, ListItem,ListItem,ListItem,GroupItem,ListItem等。
如何更改控件以使每个GroupItem也包含一组ListItem?
答案 0 :(得分:2)
您应该能够创建GroupStyle
并专门使用ContainerStyle
来定义使用Expander可折叠的组。这不需要DataTemplate
或ControlTemplate
,因为它特定于分组功能。请查看MSDN上的“GroupStyle.ContainerStyle”属性,this other answer也提供了一个示例。