分组和树形结构是不一样的。

树形结构是以递归形式存在。分组是以键值对存在的形式,类似于GroupBy这样的形式。

举个例子

ID NAME SEX Class
1 张三 1
2 李四 2
3 王二 1

当以Sex为分组依据时则是

Key Value
1 张三 1
3 王二 1
2 李四 2

那么,我们如何在WPF使用呢?当然了 我们在WPF中的表现形式和图表稍微不同的。

首先,我们介绍如何分组。

我们的数据模型如下

  public enum Sex
{
男,

}
public class Test
{
public string Name { get; set; }
public int Id { get; set; }
public Sex SexType { get; set; }
public int Class { get; set; }
}

非常的简单,下面的代码是我们的ViewModel

   public class ViewModel
{
public ViewModel()
{
for (int i = 0; i < 10; i++)
{
Test t = new Test();
t.Class = i % 2 == 0 ? 1 : 2;
t.Id = i * 100;
t.Name = "Name" + i;
t.SexType = i % 2 == 0 ? Sex.男 : Sex.女;
Model.Add(t);
}

for (int i = 0; i < 10; i++)
{
Test t = new Test();
t.Class = i % 2 == 0 ? 3 : 4;
t.Id = i * 200;
t.Name = "Name" + i;
t.SexType = i % 2 == 0 ? Sex.男 : Sex.女;
Model.Add(t);
}
}
private ObservableCollection<Test> mode = new ObservableCollection<Test>(); public ObservableCollection<Test> Model
{
get { return mode; }
set { mode = value; }
} }

就是简单的添加一些数据。

我们的前台界面上就是datagrid。

然后是最重要的分组xaml代码

  <CollectionViewSource x:Key="cvs" Source="{Binding Model}">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="SexType"/>
<PropertyGroupDescription PropertyName="Class"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>

Groupscriptptions内就是我们分组依据。

PropertyName是分组依据,是集合内的属性。

当我们添加了多个参数就还会产生层级分组,就是上一个分组基础上再次分组。

比如我们最开始的数据多次分组。

一开始SEX,我们再加上一个class分组依据:

Key Value
Key value
1 1 张三 1
3 王二 1
Key value
2 2 李四 2

当我们创建完分组后,则是布局

剩下就布局了。

布局就是(Datagrid,Listbox.).GroupStyle了,

其中

Panel属性是决定布局面板的,通常与你使用GroupStyle的空间有关。

DataGrid的GroupStyle的Panel使用DataGridRowsPresenter

因为Panel属性默认是StackPanel,所以DataGrid使用分组时,列的宽度设定为*时 可能出现错误。

所以要注意

ContainerStyle是决定生成GroupItem的样式,通常自己发挥就好了

由于分组之后的集合的类型是微软内部类。

最常用的属性

Name

Items

对应我图表中的Key和Value,换据说在ContainerStyle中你只有这两个常用属性可以绑定,Items是你分组后 ,你自己的类型的集合,这个时候就可以使用你自己的属性进行绑定了。

GroupStyle属性是一个集合,可以存在多个子项,子项的名称也是GroupStyle.

多个子项是对应不同的分级,既第一个子项对应第一层分组,第二对应第二层。

于是乎

我们给出这样的布局

     <DataGrid HeadersVisibility="None"  AutoGenerateColumns="False" CanUserAddRows="False" ItemsSource="{Binding Source={StaticResource cvs}}">
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.Panel>
<ItemsPanelTemplate>
<DataGridRowsPresenter/>
</ItemsPanelTemplate>
</GroupStyle.Panel>
<GroupStyle.ContainerStyle>
<Style TargetType="GroupItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Expander ExpandDirection="Right" Header="{Binding Name}" IsExpanded="True">
<ItemsPresenter/>
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="GroupItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border>
<Expander ExpandDirection="Down" Header="{Binding Name}" IsExpanded="True">
<Expander.HeaderTemplate>
<DataTemplate>
<Grid Background="Yellow" >
<TextBlock >
<Run Text="班级:"/>
<Run Text="{Binding Mode=OneWay}"/>
</TextBlock>
</Grid>
</DataTemplate>
</Expander.HeaderTemplate>
<ItemsPresenter/>
</Expander>
</Border> </ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
<DataGrid.Columns>
<DataGridTextColumn Width="*" Header="姓名" Binding="{Binding Name}"/>
<DataGridTextColumn Width="*" Header="性别" Binding="{Binding SexType}"/>
<DataGridTextColumn Width="*" Header="Id" Binding="{Binding Id}"/>
</DataGrid.Columns>
</DataGrid>

再稍微修改下样式,于是乎我们得到了这样的画面

因为我们是通过expander修改而成,如果想要更加细微的画面,建议自定义控件。

具体代码请参考源代码

WPF 分组的更多相关文章

  1. wpf CollectionViewSource与ListBox的折叠、分组显示,及输入关键字 Filter的筛选

    在wpf中虽然ObservableCollection<T>作为ListBox的Itemsource,很好,很强大!但是CollectionViewSource与ListBox才是天作之合 ...

  2. WPF里ItemsControl的分组实现 --listbox 实现分组

    我们在用到ItemsControl时,有时会用到分组,如ListBox,ListView,DataGrid.WPF的ItemsControl可以实现分组,是依托于GroupStyle,以ListBox ...

  3. WPF,ListView设置分组

    原文:WPF,ListView设置分组 今天遇到一个问题,就是在ListView中设置分组.想了很久在网上早了些资料作出一个例子. 分组字段也可以在后台中定义: CollectionView view ...

  4. C# WPF DataGrid 分组(Group)

    原文:C# WPF DataGrid 分组(Group) 效果如图,每个列的名字可以自定义.我随便用了”File”和”Attachment Name”.  在Window的Resources里面设置S ...

  5. WPF DataGrid分组和排序

    之前一直用的Dev的GridControl,控件自带分组排序啥的.今天试了下在wpf自带的Datagrid控件上实现分组和排序. Datagrid上实现这些功能主要用到CollectionViewSo ...

  6. WPF里ItemsControl的分组实现

    我们在用到ItemsControl时,有时会用到分组,如ListBox,ListView,DataGrid.WPF的ItemsControl可以实现分组,是依托于GroupStyle,以ListBox ...

  7. WPF - Group分组对ListBox等列表样式的约束

    原文:WPF - Group分组对ListBox等列表样式的约束 在做WPF主题支持时,出现一个分组引起的莫名错误,可是折腾了我一番.在没有使用样式时,列表分组很正常,使用了别人写的ListBox列表 ...

  8. WPF下Itemscontrol分组 样式

    原文 WPF下Itemscontrol分组 样式 <ItemsControl Grid.Row="1" DataContext="{Binding Layouts} ...

  9. WPF筛选、排序和分组

    可以通过CollectionViewSource或者CollectionView对视图进行排序.筛选和分组. 一.通过CollectionViewSource listingDataView是Coll ...

随机推荐

  1. s函数中积分程序更改

    function [sys,x0,str,ts,simStateCompliance] = int_hyo(t,x,u,flag) switch flag, case 0, [sys,x0,str,t ...

  2. 手撕spring核心源码,彻底搞懂spring流程

    引子 十几年前,刚工作不久的程序员还能过着很轻松的日子.记得那时候公司里有些开发和测试的女孩子,经常有问题解决不了的,不管什么领域的问题找到我,我都能帮她们解决.但是那时候我没有主动学习技术的意识,只 ...

  3. Nestjs模块机制的概念和实现原理

    1 前言 Nest 提供了模块机制,通过在模块装饰器中定义提供者.导入.导出和提供者构造函数便完成了依赖注入,通过模块树组织整个应用程序的开发.按照框架本身的约定直接撸一个应用程序,是完全没有问题的. ...

  4. numpy教程05---ndarray的高级操作

    欢迎关注公众号[Python开发实战], 获取更多内容! 工具-numpy numpy是使用Python进行数据科学的基础库.numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变 ...

  5. linux磁盘概述

    硬盘简史 世界上第一块硬盘出生在1956年,至今已有61年半个多世纪的历史.它由IBM公司制造,世界上第一块硬盘:350RAMAC.盘片直径为24英寸,盘片数为50片,重量则是上百公斤,相当于两个冰箱 ...

  6. QT-进制转换计算器

    适合初学者练手 用QT做的一个进制转换工具,主要涉及数据类型转换.//后面再加上基本的计算. Github地址:https://github.com/wsdassssss/Calculate.git ...

  7. Blazor 生命周期

    执行周期 1. SetParametersAsync 2. OnInitializedAsync(调用两次) 和 OnInitialized: 3. OnParametersSetAsync 或 On ...

  8. windows10家庭版启用组策略gpedit.msc

    启用组策略gpedit.msc 家庭版很多功能不能使用,凑巧用的就是家庭版. 还想使用gpedit.msc来关闭windows10的更新. 找到一个可行的方法. 需要创建一个脚本. 如果你没有编辑器, ...

  9. 邮件html页编写指南

    前言 写过邮件的html一般都用table来布局,为什么呢?原因是大多数的邮件客户端(比如Outlook和Gmail),会过滤经过多次的邮件编写实践及度娘的指导,我发现,编写自制兼容outlook与f ...

  10. Python获取文件夹下的所有文件名

    1 #获取文件夹内的图片 2 import os 3 def get_imlist(path): 4 return [os.path.join(path,f) for f in os.listdir( ...