假设我在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能够为每个列表指定不同的一个。有意义吗?
答案 0 :(得分:0)
我不是100%肯定你想要实现的目标,但听起来你正在寻找的是一个DataTemplateSelector?
http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx