[WPF]ListView点击列头排序功能实现

这是一个非常常见的功能,要求也很简单,在Column Header上显示一个小三角表示表示现在是在哪个Header上的正序还是倒序就可以了。微软的MSDN也已经提供了实现方式。微软的方法中,是通过ColumnHeader Template实现的,一共要维护至少两个Header Template,一个显示正三角,一个显示倒三角。在用户点击Header的时候同时切换使用的Template。如果你的ListView只提供Sort功能,这个方法就可以了。但是如果你的ListView还在在Header中提供Filter功能呢?如果还需要用户可以配置是否开启Sort和Filter功能呢?那么你就需要6个Template来处理Sort和Filter的组合。如果在Header本来就有好几种(文字Header、画片Header等)或是要放入更多的功能呢?显然微软的这个方式只能用于技术演示(当然MSDN本来就是这个目的),面对实际项目时就会力不从心。Google搜索WPF ListView Sort,可以找到很多不同的实现方式。

1.       SwitchOnTheCode:使用Adorner Layer,重写Adorner的OnRender方法,画出一个三角形。画个三角可以,要画个有发光、渐变、动画效果的三角,代码会变得很难维护。而且不能用Blend去编辑这个样式。不过思路是很好的,因为它不会占用控件的现有的任何属性,就不会有微软的方式中功能组合的问题。

2.       Jeol Rumerman’s Blog:继承GridViewColumn,扩展出Sort功能。还是用Header Template,更糟糕的是,为加一个功能而使用继承本身就不是一个很好的设计。同理要加个Filter功能,是不是还要继承出一个FilteredGridViewColumn和FilteredAndSortedGridViewColumn呢?不仅要处理Template的组合,还会产生类膨胀,实在是不可取。

3.       CodeProject WPFListViewSorter:与微软的方式一样,只是通过自定义Sorter函数解决了微软的方式中,把Column Header上的名字,当作Sort Property的问题。

4.       Thejoyofcode:通过Attached Property解决了同样的问题,而且没有界面显示的实现。而且还继承出了一个SortableListView。缺点就不再解释了。

5.       Marlongrech:提供了Disable/Enable Sort功能。不过也是用HeaderTemplate做界面实现。(突然发现Wordpress可以访问了)

没有找到一个满足我要求的实现方式,每个解决方案都只是关注于自己要解决的问题的那一个点上。当然在Blog里让示例简单一些也没有错。那就让我把他们所解决的问题集成到一个示例中。要求也不多。

1.       不影响现有功能。

2.       不独占现有属性。

3.       使用组合,而不是继承。

第一个方案,使用Adorner Layer是个很好的思路,Adorner Layer相当于一个画板,我画在这里,别的功能画在那里就是了,所以不会影响现有功能也不算独占现有属性。它的示例中占用了Tag来描述使用哪个属性排序。我们用Attached Property替换掉就可以了。然后就剩下一个问题了——不要画三角。我们想用Template。这样不同的地方的样子可以有不一样的界面效果而又不用修改代码。但是问题是Adorner是没有Template的。

参考了两篇关于Adorner Layer的文章。

1.       Adorners in WPF

2.       Visual Level Programming vs Logical Level Programming

写了一个晚上的代码,终于搞出一个自我感觉良好的实现出来。在ListView上添加Sort功能,只需要添加一个Attached Property就可以。代码如下。

Add Sort to ListView

[WPF]ListView点击列头排序功能实现相关推荐

  1. wpf中ListView控件点击列头排序功能实现(超简洁实用)

    .xaml文件中的主要代码 <ListView Name="lvMeasureData" GridViewColumnHeader.Click="Sort_Clic ...

  2. MFC CListControl 点击列头排序的实现

    SetItemData可以为每一行绑定一个DWORD类型的变量.用GetItemData可以获得这个变量. 举个例子,假设CListCtrl中你需要显示某个数据表中的记录,该表有个流水号主键ID,一般 ...

  3. datagridview 点击列标题排序

    开发winform中,平时经常用到数据列表,我们大多选用datagridview,但是此控件本身没有排序的功能.参阅网上资料.留下标记,以后备用. datagridview的数据显示一般是通过数据绑定 ...

  4. C#Datagidview 点击列头自动排序

    var c = new DataGridViewColumn(); c.CellTemplate = new DataGridViewTextBoxCell(); c.Name = name; c.H ...

  5. 交叉报表列头排序时遇到的oracle问题—oracle ORA-12704:字符集不匹配、varchar2转化为nvarchar2字符缺失、case when else后的字符类型要一致...

    在做交叉报表列头的排序时,遇到这三个问题,下面具体来说一下. 设计的数据库的表结构如图1所示: 图1 要处出来student_name_,s.grade_,s.subject_name_,这三个属性, ...

  6. wpf的listview编辑指定列_将项目添加到WPF ListView中的列

    小编典典 更少的XAML和更多的C#解决方案 如果您ListView在XAML中定义: 然后,您可以添加列并在C#中填充它: public Window() { // Initialize this. ...

  7. 巧用DBGrid控件的Sort属性实现“点击标题栏自动排序功能”。(改进版本)

    曾看见CSDN文档中有介绍到:通过ADOQuery或其它数据集组件的Sort属性配合DBGrid的OnTitleClick事件,可以方便地实现此功能.因为Sort属性可以让活动数据集按指定的字段进行排 ...

  8. DBgrid 第一列加入CheckBox,点击列头 全选/全消

    转自:http://blog.csdn.net/ytbksoft/article/details/6703722 转自:http://blog.csdn.net/lcfeng1982/article/ ...

  9. 当点击ListView的列头时,对ListView排序

    1.创建一个新的C#项目,窗体Form1会被默认创建. 2.向窗体添加一个ListView控件, 3.在Form1.cs中添加下面的代码: private ListViewColumnSorter l ...

最新文章

  1. centos ezhttp mysql_CentOS安装mysq
  2. 数据治理(Data Governance)
  3. 零编程基础学python-零编程基础怎么自学python?
  4. python版本切换_Ubuntu18.04下python版本完美切换的解决方法
  5. Python添加模块路径
  6. leetcode python3 简单题231. Power of Two
  7. Android导入第三方jar包
  8. pandas数据处理实践四(时间序列date_range、数据分箱cut、分组技术GroupBy)
  9. php 面向对象编程(class)之从入门到崩溃 高级篇
  10. STAR:转录组数据比对工具简介
  11. 数据结构——二叉树先序、中序、后序及层次四种遍历(C语言版)
  12. 1.Requests库
  13. 大数据小结(1-4)
  14. Interview QA-COBOL COBOL II
  15. Git commit hook 规范标准配置
  16. 荐:Java常见设计模式
  17. 物联网安全的发展现状与展望
  18. 迈普 S4320配置相关资料介绍配置
  19. Spring之底层架构核心概念解析
  20. DZY Loves Partition

热门文章

  1. 导出配置_Lua配置表导出优化
  2. c语言语言教程0基础_C语言基础
  3. c语言 函数的参数传递示例_isgreater()函数以及C ++中的示例
  4. 如何在Python中针对一个值检查多个变量?
  5. 05-图像的平滑处理(不同的滤波操作)
  6. 实训09.09:简单的彩票系统(注册信息)
  7. ffmpeg 解码视频(h264、mpeg2)输出yuv420p文件
  8. mysql查询入门_Mysql入门(四)查询
  9. 83. 删除排序链表中的重复元素 golang
  10. redis源码剖析(七)—— Redis 数据结构dict.c