转自:http://blog.csdn.net/tcjiaan/article/details/8069349

有时候,数据的量比较大,有可以我们需要对其进行分组,以方便查看,就像系统的应用程序列表一样。

其实支持分组视图的控件是ItemsControl控件,不过也许我们比较少用到它,至少,它算是一个半成品,我呢,平时用得较多的要数ListView,因为这个控件很强大,也较为灵活。所以,本文的示例我计划用ListView来完成,其实原理都一样,这个东西完全可以举一反五。

在开工之前,先计一下原理。

A、在设置ItemsSource时,应该使用CollectionViewSource,这玩意儿很实用,它是MV-VM绑定的利器,我们把控件的数据源绑定CollectionViewSource上,而我们的代只要设置CollectionViewSource的Source属性就可以了。

B、一般分组的集合,大致是这样的结构,某类型的集合,而某类型至少具有用于标识分组的属性,和组内成员的列表。比如这样,

class StudentGroup

{

public string 姓 { get; set; }

public string[] 学生s { get; set; }

}

这样的类结构表明,以学生的姓氏作为分组标识,而另外一个成员至少也是一个IList,即于这个组的成员,比如“王”,那么IList类型的属性里面放的就是姓王的所有学生的列表。

C、设置CollectionViewSource的IsSourceGrouped属性为true,这才表示对源数据进行分组,这时候,我们还要设置ItemsPath属性,通过这两个属性,CollectionViewSource就可以顺利地找到哪些属性是分组标识,哪个属性是列表,比如上面的学生例子,ItemsPath属性应该就是“学生s”了。

不过,这样说还是有点抽象,世界上没有能比实例更通俗易懂的了。

所以,Action!new一个空白页面项目,然后XAML就按照下面的输入。

[html] view plaincopyprint?

  1. <Page
  2. x:Class="App2.MainPage"
  3. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  4. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  5. xmlns:local="using:App2"
  6. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  7. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  8. mc:Ignorable="d">
  9. <Page.Resources>
  10. <CollectionViewSource x:Name="cv" x:Key="cv" IsSourceGrouped="True" ItemsPath="Items"/>
  11. </Page.Resources>
  12. <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
  13. <ListView ItemsSource="{Binding Source={StaticResource cv}}"
  14. SelectionMode="None">
  15. <ListView.GroupStyle>
  16. <GroupStyle>
  17. <GroupStyle.ContainerStyle>
  18. <Style TargetType="GroupItem">
  19. <Setter Property="Template">
  20. <Setter.Value>
  21. <ControlTemplate TargetType="GroupItem">
  22. <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
  23. <Grid>
  24. <Grid.RowDefinitions>
  25. <RowDefinition Height="Auto"/>
  26. <RowDefinition Height="*"/>
  27. </Grid.RowDefinitions>
  28. <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Margin="{TemplateBinding Padding}"/>
  29. <ItemsControl x:Name="ItemsControl" ItemsSource="{Binding GroupItems}" Grid.Row="1"/>
  30. </Grid>
  31. </Border>
  32. </ControlTemplate>
  33. </Setter.Value>
  34. </Setter>
  35. </Style>
  36. </GroupStyle.ContainerStyle>
  37. <GroupStyle.HeaderTemplate>
  38. <DataTemplate>
  39. <Grid Background="Green" Width="60" HorizontalAlignment="Left">
  40. <TextBlock Text="{Binding Key}" FontSize="22" FontWeight="Black"
  41. Margin="15,12,15,8"/>
  42. </Grid>
  43. </DataTemplate>
  44. </GroupStyle.HeaderTemplate>
  45. <GroupStyle.Panel>
  46. <ItemsPanelTemplate>
  47. <VariableSizedWrapGrid Orientation="Horizontal" MaximumRowsOrColumns="5"/>
  48. </ItemsPanelTemplate>
  49. </GroupStyle.Panel>
  50. </GroupStyle>
  51. </ListView.GroupStyle>
  52. <ListView.ItemTemplate>
  53. <DataTemplate>
  54. <TextBlock Text="{Binding}"/>
  55. </DataTemplate>
  56. </ListView.ItemTemplate>
  57. </ListView>
  58. </Grid>
  59. </Page>

注意,设置ItemsSource属性时,记得要用Binding扩展标记,不然,你就等着看异常吧。一般CollectionViewSource应该藏在资源列表中,这样的好处是,无论你引用它多少次,它也只实例化一次,节省开销。

从例子代码中我们看到,要进行分组显示数据,GroupStyle属性至关重要。表面上这个GroupStyle好像有点复杂,其实,你别忘了VS是灰常强大的,告诉你一个很简单的方法来添加GroupStyle,这些XAML都不是我写的,是VS设计器生成的。

在设计器中选定ListView,右击,从弹出的快捷菜单中选择“添加GroupStyle”,这样你就能看到神奇的一幕了。

待VS生成代码后,我们再按照自己的需要修改一下就行了。

还没完,我们还需弄些数据来做测试,以下代码中所涉及的姓名均为虚构,若有雷同,纯属大自然的鬼斧神功。

[csharp] view plaincopyprint?

  1. public MainPage()
  2. {
  3. this.InitializeComponent();
  4. string[] arr = { "李大吉", "李鸟人", "李三狗", "李五牛", "江大头", "江三七",
  5. "朱三思", "朱二思", "朱一思", "朱头", "朱大凡", "黄自嘲", "黄先生", "黄伟大",
  6. "黄草梅", "胡中海", "胡说", "胡扯", "胡萝卜", "胡天才", "胡找死", "胡大坑",
  7. "邓天马", "邓饭桶","邓猪脑","邓高高","邓矮矮","曾草民", "曾尼玛", "曾了了",
  8. "曾三餐", "曾一般","曾一路", "吴猩猩", "吴小二","吴小三","吴小四","吴小五",
  9. "吴老七", "吴老八", "吴老九","吴老十","秦一世", "秦三世", "秦二世","秦四世",
  10. "秦五世","秦六世","秦七世","秦八牛", "张产","张凡人","张天晓","张面包","张贵重",
  11. "张天庭", "张神马","张新新","张旧旧", "许占","许宅男","许雪山","许骨头","许老大",
  12. "许老二", "许老三","许老四","许老五","许老六", "许老七"};
  13. var res =
  14. (from x in arr
  15. group x by x[0].ToString() into g
  16. select new
  17. {
  18. Key = g.Key,
  19. Items = g.ToArray()
  20. }).ToList();
  21. this.cv.Source = res.ToList();
  22. }

好了,看看效果吧。

新时尚Windows8开发(21):分组视图相关推荐

  1. 新时尚Windows8开发(25):缩放视图

    转自:http://blog.csdn.net/tcjiaan/article/details/8120584 前面有一节,我们探讨了分组视图,本节我们再来吹一下有关缩放视图.那么,这视图怎么个缩放法 ...

  2. 新时尚Windows8开发(15):扩展联系人选择器

    老周的博客http://blog.csdn.net/tcjiaan,转载请注明原作者和出处. 上回我们讨论了如何从联系人选择器中选择联系人记录.但,我们也许会发现一个问题,我们都知道,我们选择的联系人 ...

  3. 牛仔新时尚-小程序开发案例-数据库篇

    今天我将以「牛仔新时尚」小程序为例,服装行业订单小程序从设计到实现的全过程.主要讲产品逻辑搭建和数据库设计的过程.这个小程序的主要功能是向用户展示服装和面料商品,并提供搜索.收藏商品,加入购物车和下单 ...

  4. 开发 Spring 自定义视图和视图解析器

    Spring 视图和视图解析器简介 什么是 Spring 视图和视图解析器 Spring MVC(Model View Controller)是 Spring 中一个重要的组成部分,而 Spring ...

  5. Odoo 12开发之后台视图 – 设计用户界面

    Odoo 12开发之后台视图 – 设计用户界面 一·菜单项 # 菜单项形成一个层级结构,最顶层结构 # name 是展示在用户界面中的菜单标题 # action 是点击菜单时运行的窗口 # paren ...

  6. IOS开发之表视图(UITableView)

    IOS开发之表视图(UITableView)的基本介绍(一) (一):UITableView的基本概念 1.在IOS开发中,表视图的应用十分广泛和普及.因此掌握表视图的用法显得非常重要.一般情况下对于 ...

  7. IOS开发-TableView表视图基础

    表视图在IOS中的应用非常广泛,常用于展示显示数据列表. 在工具组中包含了Table View 和Table View Cell 每个表示图都是UITableView的一个实例,每个可见行都是UITa ...

  8. 开发者必看|Android 8.0 新特性及开发指南

    背景介绍 谷歌2017I/O开发者大会今年将于5月17-19日在美国加州举办.大会将跟往年一样发布最新的 Android 系统,今年为 Android 8.0.谷歌在今年3 月21日发布 Androi ...

  9. 【windows8开发】开发平台与开发框架

    开门见山,先把windows8 开发平台和开发框架分享给大家.       win8 App开发主要分成两部分,desktop app和metro app.右边蓝色的部分就是desktop app的部 ...

最新文章

  1. Android 常见工具类封装
  2. python读取c盘中的csv文件-python读取当前目录下的CSV文件数据
  3. MPLS ×××-IPv4地址结构
  4. 让图片自适应大小的方法
  5. 银行停贷、涨息、排队,8月不贷只能等明年
  6. mysql+一致性非锁定读_MySQL探秘(六):InnoDB一致性非锁定读
  7. java 两个对象合并_Java 对象按照多个属性来合并。
  8. matlab2c使用c++实现matlab函数系列教程-deconv函数
  9. hdu-5656 CA Loves GCD(dp+数论)
  10. 第四章 MyBatis-SQL映射文件
  11. Unity学习资料收集
  12. CentOS SSH安装和配置
  13. 缥缈峰--JVM系列之内存区域
  14. c语言中大写a对应的数字,123456789a
  15. 中文地址识别api的使用测试,快递地址自动补全,自动识别省市区,地址清洗,到底哪个好用?
  16. oracle12c数据库命令,oracle 12c 常用命令
  17. 华为机试-字符串子序列II
  18. 苹果7服务器是什么系统版本,最新系统 iOS14.7 Beta1 版本推出!
  19. 【polar】协作polar码和非协作polar码的误码率性能matlab仿真
  20. matlab中sign函数的使用(提取符号)

热门文章

  1. Usb Composite Device (audio+hid) Descriptor
  2. 全面打通DevOps数据链的研发效能度量平台
  3. 基于python3+opencv3遥感影像的湖泊边界提取
  4. Linux的recovery分区编译,Recovery移植之高级小白教程——Recovery的编译
  5. 形象标识 新松机器人_辽宁日报- 厉害了新松!获评年度“新锐品牌”成为国家形象名片...
  6. Spring Boot JPA实体类idea自动生成 其一-https://www.jianshu.com/p/44bb7e25f5c7
  7. Collections.sort()排序使用TimSort排序报Comparison method violates its general contract 原因
  8. MEEGO系统七大优势
  9. Linux时间 新纪元 epoch time
  10. 教你使用内嵌chatGPT的新必应(bing)