今天我要介绍如何使用CollectionViewSource对数据进行分组以及对各个组进行排序

示例中的数据源是一组类型为Animal的对象组成的数据集合。Animal类包含Name和Category(枚举类型)两个属性。现在要以Category为分组来显示数据:
    <Window.Resources>
        <local:Animals x:Key="animals"/>

<CollectionViewSource x:Key="cvs" Source="{Binding Source={StaticResource animals}, Path=AnimalList}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="Category"/>
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>

<DataTemplate x:Key="animalTemplate">
            <TextBlock Text="{Binding Path=Name}" Foreground="MediumSeaGreen"/>
        </DataTemplate>
    </Window.Resources>

<ItemsControl ItemsSource="{Binding Source={StaticResource cvs}}" ItemTemplate="{StaticResource animalTemplate}"/>

我在上一篇文章中介绍过CollecitonViewSource。CollectionViewSource类会在数据源的上层生成一个视图。这个视图监控着选中项,并且允许我们对数据项进行分组,排序和过滤

运行上面的代码后,可以看到动物的名称,但分组信息没有显示出来。接下来要创建一个显示分组信息的模板。CollectionViewSource将每个分组都包装到CollectionViewGroup对象中。然后显示其Name属性即可:

<DataTemplate x:Key="categoryTemplate">
        <TextBlock Text="{Binding Path=Name}" FontWeight="Bold" Foreground="ForestGreen" Margin="0,5,0,0"/>
    </DataTemplate>

接下来让ItemsControl控件的GroupStyle属性应用上面的模板:
    <ItemsControl ItemsSource="{Binding Source={StaticResource cvs}}">
        <ItemsControl.GroupStyle>
            <GroupStyle HeaderTemplate="{StaticResource categoryTemplate}" />
        </ItemsControl.GroupStyle>
    </ItemsControl>

如果需要显示多级别的分组,可以添加多个GroupStyle(示例中只添加了一个)

现在,程序已经可以正确地显示分组和各个项目了。如果还要实现组的排序,并对组内的项进行排序该怎么作呢?我看到有人想写个类似于”SortGroups”的方法来实现这个功能。实际上不必这么做,只要对“进行了分组的属性”进行排序就可以实现这个功能:
    <CollectionViewSource x:Key="cvs" Source="{Binding Source={StaticResource animals}, Path=AnimalList}">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="Category"/>
        </CollectionViewSource.GroupDescriptions>
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="Category" />
            <scm:SortDescription PropertyName="Name" />
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>

有一点需要注意:Category是一个枚举类型,所以“组排序”的顺序是根据其在枚举中定义的顺序。而Name属性是字符串类型,所以“组内排序”是根据字母顺序

程序截图:

原文地址:http://www.beacosta.com/Archive/2006_01_01_bcosta_archive.html

转载于:https://www.cnblogs.com/stswordman/archive/2007/01/08/615092.html

How do I sort groups of data items?(WPF)相关推荐

  1. 【转】多线程Core Data

    原文地址:http://www.cocoanetics.com/2012/07/multi-context-coredata/ Multi-Context CoreData When you star ...

  2. numpy np.sort()函数(指定对某一轴进行排序,返回数组的排序副本)(成对数组不要用这个排,用哪个啥lexsort()或argsort()都行)

    指定对哪一层进行排序,如果需排序的是多维数组,特别是那种np.sort()貌似不太友好 from numpy\core\fromnumeric.py @array_function_dispatch( ...

  3. Why Apache Spark is a Crossover Hit for Data Scientists [FWD]

    Spark is a compelling multi-purpose platform for use cases that span investigative, as well as opera ...

  4. 【Hadoop】HBase 数据模型(Data Model)

    Data Model 在HBase中,数据是存储在有行有列的表格中.这是与关系型数据库重复的术语,并不是有用的类比.相反,HBase可以被认为是一个多维度的映射. HBase数据模型术语 Table( ...

  5. 【javaWeb微服务架构项目——乐优商城day07】——Elasticsearch介绍和安装及使用(安装kibana,安装ik分词器,Spring Data Elasticsearch,高级查询)

    文章目录 0.学习目标 1.Elasticsearch介绍和安装 1.1.简介 1.1.1.Elastic 1.1.2.Elasticsearch 1.1.3.版本 1.2.安装和配置 1.2.1.新 ...

  6. 微服务架构(7):ElasticsearchSpring Data Elasticsearch的使用

    微服务架构(7):Elasticsearch&&Spring Data Elasticsearch的使用 学习目标 1.Elasticsearch介绍和安装 1.1.简介 1.1.1. ...

  7. vue 数组赋值_如何给Vue的data中的数组赋值?

    慕运维8079593 html {{item.index}}  {{item.domain}}  {{item.price}}  {{item.trade_type}}  {{item.endtime ...

  8. 几个常用的文本处理shell 命令:find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk

    内容目录: find 文件查找 grep 文本搜索 xargs 命令行参数转换 sort 排序 uniq 消除重复行 用tr进行转换 cut 按列切分文本 paste 按列拼接文本 wc 统计行和字符 ...

  9. C#——实现IComparableT 接口,ArrayLIst调用ArrayLIst.Sort()抛出System.InvalidOperationException异常解决方案

    问题描述 未经处理的异常: System.InvalidOperationException: 未能比较数组中的两个元素. ---> System.ArgumentException: 必须至少 ...

最新文章

  1. JavaScript获取鼠标左键选中的内容
  2. 常考数据结构和算法:设计LRU缓存结构
  3. 2016 年崛起的 JS 项目
  4. C++中size_type类型详解
  5. 使html表格可编辑状态,js+Html实现表格可编辑操作
  6. 寂寞了就去搞钱?俞敏洪举报“俞敏洪”:“搞钱论”没一句话是我说的
  7. libusb-win32学习笔记(一)
  8. 操作系统的进程和线程的相关知识的理解
  9. android image 位移动画_Android共享元素转场动画实现
  10. ios android 通用字体,教你如何在iOS项目中设置各种字体
  11. mysql学生管理系统背景_学生基本系统管理
  12. 小沈阳最经典的99句台词 保证你从头笑到尾
  13. 蓝牙inquiry流程之命令下发
  14. 【JVM系列JKD8】参数参考表
  15. HDU 3221 Brute-force Algorithm(指数降幂公式)
  16. 《疯狂的石头》在线观看(网通用户)
  17. 双节有惊喜,思维导图优惠乐翻天
  18. Date.now()和new.Date().getTime()的区别
  19. MySQL入门之目录
  20. hbase major compact脚本

热门文章

  1. 完全备份、差异备份、增量备份的区别
  2. Java面试题 Java中sleep和wait的区别?
  3. 不重复的随机数JAVA、C#·适合初级人员玩耍。
  4. 使用flush-logs命令重新生成MySQL的相关日志文件
  5. Oracle分页查询语句
  6. 64位windows7配置32位odbc
  7. CSS实例:图片导航块
  8. codis 部署和测试
  9. Asianux Server 3.0安装截图
  10. 戏说模式-追MM与设计模式 (转载)