グループ化されたデータがリストボックスに入力され、その下にヘッダーと子アイテムがあります-各グループヘッダーがエキスパンダー(最初は閉じている)であり、展開すると、その下にあるそのグループのアイテムが表示されるようにコントロールをカスタマイズしたいと思います
私はまだWPFを初めて使用するので、これをどのように行うのでしょうか。GroupStyleのHeaderTemplate(ここにItemsPresenterが含まれますか?)とItemTemplateのデータテンプレートを実装する必要がありますか、それとも2つのデータテンプレートに加えて完全に新しいControlTemplateを作成する必要がありますか?
また、ヘッダーにエキスパンダーを使用すると、リストボックスのアイテム仮想化機能が無効になりますか?もしそうなら、これが起こらないようにするために私は何ができますか?VirtualizingStackPanelをExpanderコンテンツに配置した場合、これは軽減されますか、それともこれは不要ですか?
私のグループ化は非常に単純で、1つのフィールドのフラットなコレクションです。
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も含めることができるように、コントロールを変更するにはどうすればよいですか?