我们在用到ItemsControl时,有时会用到分组,如ListBox,ListView,DataGrid。WPF的ItemsControl可以实现分组,是依托于GroupStyle,以ListBox为例,他的分组效果图为:

  以下为前台:

  1. 1 <ListBox Name="lbMain">
  2. 2 <ListBox.ItemTemplate>
  3. 3 <DataTemplate>
  4. 4 <StackPanel Orientation="Horizontal">
  5. 5 <TextBlock Text="{Binding FileName}"
  6. 6 Width="150" />
  7. 7 <TextBlock Text="{Binding AuthorName}"
  8. 8 Width="100" />
  9. 9 <TextBlock Text="{Binding UpTime}"
  10. 10 Width="100" />
  11. 11 </StackPanel>
  12. 12 </DataTemplate>
  13. 13 </ListBox.ItemTemplate>
  14. 14 <ListBox.GroupStyle>
  15. 15 <GroupStyle>
  16. 16 <GroupStyle.ContainerStyle>
  17. 17 <Style TargetType="{x:Type GroupItem}">
  18. 18 <Setter Property="Template">
  19. 19 <Setter.Value>
  20. 20 <ControlTemplate TargetType="{x:Type GroupItem}">
  21. 21 <Expander IsExpanded="True"
  22. 22 ExpandDirection="Down">
  23. 23 <Expander.Header>
  24. 24 <StackPanel Orientation="Horizontal">
  25. 25 <TextBlock Text="{Binding Path=Name}"
  26. 26 VerticalAlignment="Center" />
  27. 27 <TextBlock Text="{Binding Path=ItemCount, StringFormat=数量:{0}}"
  28. 28 VerticalAlignment="Center"
  29. 29 Margin="5,0,0,0" />
  30. 30 <Button Content="Sale"
  31. 31 Margin="5,0,0,0" />
  32. 32 </StackPanel>
  33. 33 </Expander.Header>
  34. 34 <ItemsPresenter />
  35. 35 </Expander>
  36. 36 </ControlTemplate>
  37. 37 </Setter.Value>
  38. 38 </Setter>
  39. 39 </Style>
  40. 40 </GroupStyle.ContainerStyle>
  41. 41 </GroupStyle>
  42. 42 </ListBox.GroupStyle>
  43. 43 </ListBox>

  从16行可以看出,GroupStyle定义的是控件内部样式,所以有人尝试在这里绑实体数据属性的话肯定是失败的,注意25行只能是Name,不管分组的属性叫什么名,这都只能是Name,我写了个Button在里面,如果想知道为什么只能是Name,写个Click处理,把Button的DataContext打印出来就什么都知道了。如果想在这里做更多的处理,比如进行一些负责的运算,可以写加转换器。

  这里只是弄了一个原始的Expander装载分组控件,需要美化可以另写样式。

  以下是后台:

  1. 1 public class ModelFile
  2. 2 {
  3. 3 public string FileName { get; set; }
  4. 4 public string AuthorName { get; set; }
  5. 5 public string UpTime { get; set; }
  6. 6 }
  7. 7
  8. 8 public partial class MainWindow : Window
  9. 9 {
  10. 10 public ObservableCollection<ModelFile> CollectionModelFile = new ObservableCollection<ModelFile>();
  11. 11
  12. 12 public MainWindow()
  13. 13 {
  14. 14 InitializeComponent();
  15. 15
  16. 16 CollectionModelFile.Add(new ModelFile() { FileName = "WPF进化史", AuthorName = "王鹏", UpTime = "2014-10-10" });
  17. 17 CollectionModelFile.Add(new ModelFile() { FileName = "WPF概论", AuthorName = "大飞", UpTime = "2014-10-10" });
  18. 18 CollectionModelFile.Add(new ModelFile() { FileName = "WPF之美", AuthorName = "小虫", UpTime = "2014-10-11" });
  19. 19 CollectionModelFile.Add(new ModelFile() { FileName = "WPF之道", AuthorName = "青草", UpTime = "2014-11-11" });
  20. 20 CollectionModelFile.Add(new ModelFile() { FileName = "WPF之禅", AuthorName = "得瑟鬼", UpTime = "2014-11-11" });
  21. 21 CollectionModelFile.Add(new ModelFile() { FileName = "WPF入门", AuthorName = "今晚吃什么", UpTime = "2014-11-11" });
  22. 22 CollectionModelFile.Add(new ModelFile() { FileName = "WPF神技", AuthorName = "无间道王二", UpTime = "2014-12-12" });
  23. 23 CollectionModelFile.Add(new ModelFile() { FileName = "WPF不为人知之密", AuthorName = "星期八", UpTime = "2014-12-12" });
  24. 24 CollectionModelFile.Add(new ModelFile() { FileName = "WPF之革命", AuthorName = "两把刀", UpTime = "2014-12-12" });
  25. 25
  26. 26 lbMain.ItemsSource = CollectionModelFile;
  27. 27
  28. 28 ICollectionView cv = CollectionViewSource.GetDefaultView(lbMain.ItemsSource);
  29. 29 cv.GroupDescriptions.Add(new PropertyGroupDescription("UpTime"));
  30. 30 }
  31. 31 }

  重点是28、29行,有了这两句,ListBox就能准确得分组显示了,其他ItemsControl的分组类同。

  至此一个简单的ListBox分组显示就完成了,Demo已放群里,需要的可以下载来看。

WPF里ItemsControl的分组实现 --listbox 实现分组的更多相关文章

  1. WPF里ItemsControl的分组实现

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

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

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

  3. WPF下Itemscontrol分组 样式

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

  4. 在WPF里实现计算器软件

    一.具体代码 类代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; us ...

  5. WPF里的一些Effect特效

    原文:WPF里的一些Effect特效 Blend的特效都在Microsoft.Expression.Media.Effects里,用之前添加一下引用. 可以在前台选中对象后直接点击Effect新建一种 ...

  6. WPF中ItemsControl应用虚拟化时找到子元素的方法

    原文:WPF中ItemsControl应用虚拟化时找到子元素的方法  wpf的虚拟化技术会使UI的控件只初始化看的到的子元素, 而不是所有子元素都被初始化,这样会提高UI性能. 但是我们经常会遇到一个 ...

  7. SQL Server 根据日期分组、 根据时间段分组(每三个小时一组)

    所用数据表: 一.根据日期分组 1. 使用convert() 函数方式 --根据年月 ),CreatTime,)日期,COUNT(*) 次数,sum(Money)总数 from Orders ),Cr ...

  8. Mysql高手系列 - 第9篇:详解分组查询,mysql分组有大坑!

    这是Mysql系列第9篇. 环境:mysql5.7.25,cmd命令中进行演示. 本篇内容 分组查询语法 聚合函数 单字段分组 多字段分组 分组前筛选数据 分组后筛选数据 where和having的区 ...

  9. mysql按字段分组并获取每个分组按照某个字段排序的前三条

    这是原始数据 想按照brand_id分组 并获取每个分组total_num最高的前3位 SQL语句为: > (select count(*) from data where brand_id = ...

随机推荐

  1. appium安装问题集锦

    问题一: MacBook-Air:Cellar$ npm -v dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.61.dyl ...

  2. FPGA定点小数计算中截位形式的探讨

    在FPGA设计过程中难免会碰到需要进行截位,那定点小数的计算过程中我们需要注意些什么呢? 首先,我们考虑如下计算式. sin cos 数据形式是 FIX_32_30 X Y Z 数据形式是 FIX_3 ...

  3. keepalived给LVS带来了什么

    LVS+Keepalived 1>Keepalived简介  Keepalived是Linux下一个轻量级别的高可用解决方案,高可用(High Avalilability,HA),其实两种不同的 ...

  4. day24_雷神_django项目部署

    # django项目部署 ... curl -I www.baidu.com 得到响应头信息 vim 里shift + % 找括号的另一半 find / -name virtualenv 3.创建虚拟 ...

  5. spring 排除指定的类或者包扫描

    <!-- 排除Controller注解的扫描 --> <context:component-scan base-package="exampleBean"> ...

  6. [转] KVM VirtIO paravirtualized drivers: why they matter

    http://www.ilsistemista.net/index.php/virtualization/42-kvm-virtio-paravirtualized-drivers-why-they- ...

  7. MySQL Schema与数据类型的优化

    选择优化的数据类型: 1. 更小的通常更好: 一般情况下,应该尽量使用可以正确存储数据的最小数据类型.更小的数据类型通常更快,因为他们占用更少的磁盘,内存和cpu缓存,并且处理时需要的cpu周期也更少 ...

  8. FFmpeg 学习(三):将 FFmpeg 移植到 Android平台

    首先需要去FFmpeg的官网http://www.ffmpeg.org/去下载FFmpeg的源码,目前的版本号为FFmpeg3.3(Hilbert). 下载的文件为压缩包,解压后得到ffmpeg-3. ...

  9. Javascript高级编程学习笔记(63)—— 事件(7)鼠标及滚轮事件

    鼠标与滚轮事件 鼠标事件是web开发中最常用的一类事件,毕竟鼠标是最主要的定位设备 DOM3级事件中定义了9个鼠标事件: click:在用户单击主鼠标按钮(一般为鼠标左键)或者按下回车时触发,这一点对 ...

  10. SpringMVC框架六:拦截器

    拦截器的概念就不介绍了: SpringMVC中拦截器的执行规则: 一个小示例展示: 我搞两个拦截器: 第一个: package org.dreamtech.springmvc.interceptor; ...