【问题标题】:How to customize Group Header in DataGrid Grouping?如何在 DataGrid 分组中自定义组标题?
【发布时间】:2011-04-15 10:01:07
【问题描述】:

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

我按性别对数据进行了分组。我的 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 样式以实现此目的,以便每次在数据网格中对数据进行分组时,组标题都可以显示为 GroupHeaderTitle : GroupHeaderValue?或者我是否需要更改 GroupItem 样式以外的任何内容来实现这一点?

【问题讨论】:

    标签: wpf datagrid grouping


    【解决方案1】:

    如果您使用 MVVM,您可以在视图模型中添加一个属性 GroupTitle,它表示所需的组标题,否则添加到您的 Window 代码隐藏,然后在绑定到 @ 的 Expander.Header 添加另一个 TextBlock 987654323@属性,见下面代码sn-p:

    <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>
    

    【讨论】:

    • 这是一个硬编码的解决方案。如果按年龄划分用户组怎么办? “每次我在数据网格中对数据进行分组时,组标题都会显示为 GroupHeaderTitle : GroupHeaderValue”
    • @haris:是的,你是对的,我更新了我的答案,现在检查一下。
    • 我理解你的意思,但我允许用户进行多个嵌套分组。基于属性的解决方案将再次成为一种硬编码解决方案。我想要一个适用于所有嵌套分组的通用解决方案。在我的场景中,完全取决于用户是否要按性别、年龄或任何其他列分组,同样在任何分组中,他可以按任何其他列分组
    【解决方案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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-24
      • 2011-01-05
      • 2022-12-23
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      相关资源
      最近更新 更多