当数据项数量较大的时候,为了让用户能够快速找到要查看的项,应该对数据进行分组。ItemsControl控件公开GroupStyle属性,用来设置分组视图的样式,它是一个GroupStyle对象列表,列表中的每个GroupStyle对象代表一个层次的分组。如果列表中只有一个GroupStyle对象,则表示分组视图只呈现顶层分组;如果列表中有两个GroupStyle对象,则分组视图将呈现两个层次的分组。一般来说,只需要一层分组就可以了,分组层次过多会导致应用程序界面混乱,对用户体验造成负面影响。
GroupStyle所设置的分组样式的目标类型为GroupItem,GroupItem是内容控件,派生自ContentControl,作用是在集合控件中显示分组视图,每个GroupItem实例将呈现一个组的数据。有关GroupStyle类的各个属性的详细信息参考如下:
- HeaderTemplate 定义用于显示分组标头内容的数据模板,即如何显示每个分组的组标题
- HeaderContainerStyle 定义组标头的容器控件的样式
- ContainerStyle 定义GroupItem控件的样式
- Panel 指定一个面板,用于排列每个分组视图
要实现分组视图,还需用到ColelctionViewSource类,该类可以对数据集合进行管理,尤其是支持数据分组,通过Source属性来引用原始数据列表。如果原始的数据列表已经进行过分组,应当将IsSourceGrouped属性设置为true。通常,原始数据可以使用Linq技术进行分组,并把分组结果赋值给Source属性。
CollectionViewSource类的View属性将返回一个实现了ICollectionView接口的对象实例,但该实现类并没有对外公开,开发者无法在代码中访问它,不过可以使用ICollectionView接口来访问。当数据视图分组后,IColelctionView的CollectionGroups将返回一个对象列表,其中每个对象表示一个分组的视图对象,该对象的类型实现了ICollectionViewGroup接口。同理,ICollectionViewGroup接口的实现类也没有对外公开,开发者只能通过ICollectionViewGroup接口来访问该对象。
ICollectionViewGroup接口的Group属性就是数据的分组依据,假设数据是按首字母进行分组的,那么Group属性的值就是标识该分组的单个字母。GroupItems属性返回的是属于该分组的数据项列表。
接下来将通过一个示例来演示数据视图分组功能。
本例假设有一个数据列表,表示一系列新闻纪录