WPF分组HeaderTemplate

时间:2012-10-19 03:01:09

标签: c# wpf datatemplate

假设我在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能够为每个列表指定不同的一个。有意义吗?

1 个答案:

答案 0 :(得分:0)

我不是100%肯定你想要实现的目标,但听起来你正在寻找的是一个DataTemplateSelector?

http://msdn.microsoft.com/en-us/library/system.windows.controls.datatemplateselector.aspx