如何在DataGrid分组中自定义组头?

时间:2011-04-15 10:01:08

标签: wpf datagrid grouping

我有一个看起来像这样的DataGrid。

enter image description here

我按性别对数据进行了分组。我的GroupItem样式是

<Style TargetType="{x:Type GroupItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GroupItem}">
                    <Expander x:Name="exp" IsExpanded="True"
                      Background="White"
                      Foreground="Black">
                        <Expander.Header>
                            <TextBlock Text="{Binding Name}"/>
                        </Expander.Header>
                        <ItemsPresenter />
                    </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

我希望我的群组标题“男性”和“女性”看起来像“性别:男性”和“性别:女性”,而不是简单的“男性”和“女性”。我如何修改我的GroupItem样式来实现这一点,这样每次我在datagrid中对数据进行分组时,组头可以看起来像GroupHeaderTitle:GroupHeaderValue?或者我是否需要更改除GroupItem样式以外的任何内容才能实现此目的?

2 个答案:

答案 0 :(得分:2)

如果您正在使用MVVM,则可以在视图模型中添加表示所需组标题的属性GroupTitle,否则在Expander.Header处添加另一个TextBlock。绑定到GroupTitle属性,请参阅以下代码段:

<Style TargetType="{x:Type GroupItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupItem}">
                <Expander x:Name="exp" IsExpanded="True"
                            Background="White" Foreground="Black">
                    <Expander.Header>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}, Path=DataContext.GroupTitle}"/>
                            <TextBlock Text="{Binding Name}"/>
                        </StackPanel>
                    </Expander.Header>
                    <ItemsPresenter />
                </Expander>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

答案 1 :(得分:2)

添加分组时,只需提供转换器:

// Get the default view
ICollectionView view = CollectionViewSource.GetDefaultView(...);

// Do the grouping
view.GroupDescriptions.Clear();
view.GroupDescriptions.Add(new PropertyGroupDescription("Gender", new GenderConverter()));

// The converter 
public class GenderConverter : IValueConverter
{
    public object Convert(object value,
    Type targetType, object parameter, CultureInfo culture)
    {
        return string.Format("Gender: {0}", value);
    }

    public object ConvertBack(object value,
    Type targetType, object parameter, CultureInfo culture)
    {
        return DependencyProperty.UnsetValue;
    }
}