WPFのリストボックスでいくつかのグループ化を行ったとしましょう
<ListBox Name="bob" xmlns:swd="clr-namespace:System.Windows.Data;assembly=PresentationFramework">
<ListBox.Resources>
<CollectionViewSource x:Key="view">
<CollectionViewSource.GroupDescriptions>
<swd:PropertyGroupDescription PropertyName="Group"></swd:PropertyGroupDescription>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</ListBox.Resources>
<ListBox.ItemsSource>
<Binding Source="{StaticResource view}"></Binding>
</ListBox.ItemsSource>
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<Border Background="Red" TextElement.Foreground="White">
<ContentPresenter Content="{Binding Path=Name}">
<ContentPresenter.ContentTemplate>
<DataTemplate>
<TextBlock><Run Text="("></Run><Run Text="{Binding Mode=OneWay}"></Run><Run Text=")"></Run></TextBlock>
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>
</Border>
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListBox.GroupStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Item}"></TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
次のようなコードでビューを設定しました。
var view = bob.FindResource("view") as CollectionViewSource;
view.Source = "Mary,Mark,Jane,Joey,Justin"
.Split(',')
.GroupBy(i => i[0])
.SelectMany(g => g.Select(i => new { Group = g.Key, Item = i }))
.ToArray();
これは、グループ ヘッダーの外観である赤い背景の境界線を、グループ化するすべてのリスト ボックスに対して定義する必要があることを除いて、すべて非常にうまく機能しています。次に緑が必要な場合は、どこでも変更する必要があります。色を取り除いてリソースにしたり、スタイルに入れたりできますが、アイコンやその他のアイテムを追加したい場合はどうすればよいでしょうか。
私が本当にできるようにしたいのは、HeaderTemplate を取り出して、一度どこかで定義することです。ただし、内部の ContentPresenter.ContentTemplate は、リストごとに異なるものを指定できます。わかる?