0

グループ化されたデータがリストボックスに入力され、その下にヘッダーと子アイテムがあります-各グループヘッダーがエキスパンダー(最初は閉じている)であり、展開すると、その下にあるそのグループのアイテムが表示されるようにコントロールをカスタマイズしたいと思います

私はまだ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も含めることができるように、コントロールを変更するにはどうすればよいですか?

4

1 に答える 1

2

を作成しGroupStyle、具体的にはを使用ContainerStyleして、エキスパンダーを使用して折りたたみ可能なグループを定義できる必要があります。これは、グループ化機能に固有でDataTemplateあるため、またはを必要としません。MSDNの「 GroupStyle.ContainerStyle」プロパティをControlTemplate見てください。この他の回答も例を示しています。

于 2012-08-19T01:55:34.267 に答える