0

我有一个由分组数据填充的列表框,下面有一个标题和子项 - 我想自定义控件,使每个组标题都是一个扩展器(最初关闭),展开它会显示它下面的该组的项目

我还是 WPF 的新手,所以我该怎么做?我是否需要为 GroupStyle 的 HeaderTemplate (这里是否包含 ItemsPresenter ?)和 ItemTemplate 实现数据模板,或者除了两个数据模板之外,我还需要创建一个全新的 ControlTemplate 吗?

另外,使用扩展器作为标题会禁用 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 也可以包含一组 ListItems ?

4

1 回答 1

2

您应该能够创建一个GroupStyle并专门使用ContainerStyle来定义可使用 Expander 折叠的组。这不需要 aDataTemplate或 aControlTemplate因为它特定于分组功能。看看 MSDN 上的“ GroupStyle.ContainerStyle ”属性,这个其他答案也提供了一个例子。

于 2012-08-19T01:55:34.267 回答