原文:谈谈WPF中的CollectionView与CollectionViewSource (1)

谈谈WPF中的CollectionView与CollectionViewSource (1)

                          周银辉



1,CollectionView是什么?

事实上当你将后台数据列表绑定到一个列表控件时,WPF为了默默地在数据列表和列表控件之间增加了层称为CollectionView(列表视图)的东西,其支持很多高级操作,比如排序,分组,过滤等.这样我们就可以将这个过程分成3个部分来看:数据列表(维持着后台数据),列表视图(维持着一些附加状态,比如"当前项","排序"等),列表控件(负责对CollectionView的呈现,而不是对Collection)

CollectionView是针对数据的,但它不会改变数据,仅仅是对数据的"映像"进行"排列组合排序"等等.一组数据可以有若干个CollectionView,就像可以对一个人拍摄若干DV一样.所以针对后台给我们的一组数据我们可以同时为用户提供若干种展现方式.

列表控件(比如ListBox)可以针对数据,也可以针对CollectionView,比如我们可以手动地向其Items集合中添加数据,也可以用ItemsSource来指定数据来源,前者是针对数据本身,这需要我们来手动维护数据的和控件之间的关系.后者是针对CollectionView,如果你没有指定列表控件对应的CollectionView,那么WPF会自动插入一个.(需要注意的是:由于同时指定Items和ItemsSource会造成混乱,所以不可以同时操作他们)

比如:<ListBox ItemsSource="{Binding Source={StaticResource myList}}"/>

或者:

CollectionView cv = new CollectionView(myList);

this.listBox.ItemsSource = cv;

2,CollectionViewSource是什么?

CollectionViewSource是CollectionView的一个XAML代理,意思就是说CollectionView不能在XAML中使用,如果希望在XML将CollectionView绑定到某个列表控件,那么请使用CollectionViewSource.它与CollectionView的基本关系是"HAS A". CollectionViewSource拥有一个CollectionView类型的View属性来指定其对应的CollectionView对象,与之对应的,其还有一个Source属性,来指明数据来源.一个简单的流程是:将数据列表绑定到CollectionViewSource的Source属性,然后将列表控件的ItemsSource属性绑定到CollectionViewSource的View属性.为什么不直接将列表控件的ItemSource属性绑定到数据列表呢,这取决于你是否需要查找到该CollectionViewSource进而查找到其View来进行视图操作(比如排序,导航等).这可能说得有些混乱了.看看下面的例子:

    <Window.Resources>



        <XmlDataProvider x:Key="Employees" XPath="/Employees/*">

            <x:XData>

                <Employees xmlns="">

                    <Employee Name="Terry Adams" Type="FTE" EmployeeNumber="1" />

                    <Employee Name="Claire O&apos;Donnell" Type="FTE" EmployeeNumber="12345" />

                    <Employee Name="Palle Peterson" Type="FTE" EmployeeNumber="5678" />

                    <Employee Name="Amy E. Alberts" Type="CSG" EmployeeNumber="99222" />

                    <Employee Name="Stefan Hesse" Type="Vendor" EmployeeNumber="-" />

                </Employees>

            </x:XData>

        </XmlDataProvider>



        <DataTemplate  DataType="Employee">

            <TextBlock Text="{Binding XPath=@Name}" />

        </DataTemplate>

        

    </Window.Resources>



    <StackPanel>

        <ListBox ItemsSource="{Binding Source={StaticResource Employees}}"/>

    </StackPanel>

上面的例子中,我们按照传统的方式,将ListBox的ItemsSource绑定到一个XMLDataProvider上,工作得很好,后来我们发现WPF中可以利用CollectionView来实现列表排序,当然这种排序我们希望仅仅是在表现层,所以我们决定我XAML来做.当在实际改造这段代码的过程中,我们伤透了脑子,因为要在XAML中为我们的数据找到CollectionView对象并非易事.

事实上,我们仅仅需要改变一下数据绑定的流程就可以了.我们将数据与CollectionViewSource关联,然后CollectionViewSource与列表控件相关联,然后我们就可以在CollectionViewSource插入我们任何想要的排序方式了.

    <Window.Resources>



        <XmlDataProvider x:Key="Employees" XPath="/Employees/*">

            <x:XData>

                <Employees xmlns="">

                    <Employee Name="Terry Adams" Type="FTE" EmployeeNumber="1" />

                    <Employee Name="Claire O&apos;Donnell" Type="FTE" EmployeeNumber="12345" />

                    <Employee Name="Palle Peterson" Type="FTE" EmployeeNumber="5678" />

                    <Employee Name="Amy E. Alberts" Type="CSG" EmployeeNumber="99222" />

                    <Employee Name="Stefan Hesse" Type="Vendor" EmployeeNumber="-" />

                </Employees>

            </x:XData>

        </XmlDataProvider>

        

        <CollectionViewSource  x:Key="cvs" Source="{Binding Source={StaticResource Employees}, XPath=/Employees/*}">

            <CollectionViewSource.SortDescriptions>

               <!--在这里插入排序描述-->

            </CollectionViewSource.SortDescriptions>

            <CollectionViewSource.GroupDescriptions>

                <!--在这里插入分组描述-->

            </CollectionViewSource.GroupDescriptions>

        </CollectionViewSource>

        

        <DataTemplate  DataType="Employee">

            <TextBlock Text="{Binding XPath=@Name}" />

        </DataTemplate>

        

    </Window.Resources>



    <StackPanel>

        <ListBox ItemsSource="{Binding Source={StaticResource cvs}}" x:Name="lb"/>

    </StackPanel>

谈谈WPF中的CollectionView与CollectionViewSource (1)的更多相关文章

  1. 谈谈WPF中的CollectionView与CollectionViewSource

    https://www.cnblogs.com/zhouyinhui/archive/2007/12/07/987076.html

  2. 在WPF中UserControl

    在这里我们将将打造一个UserControl(用户控件)来逐步讲解如何在WPF中自定义控件,并将WPF的一些新特性引入到自定义控件中来.我们制作了一个带语音报时功能的钟表控件, 效果如下: 在VS中右 ...

  3. 在WPF中自定义控件

    一, 不一定需要自定义控件在使用WPF以前,动辄使用自定义控件几乎成了惯性思维,比如需要一个带图片的按钮,但在WPF中此类任务却不需要如此大费周章,因为控件可以嵌套使用以及可以为控件外观打造一套新的样 ...

  4. 在WPF中自定义控件(2) UserControl

    原文:在WPF中自定义控件(2) UserControl 在WPF中自定义控件(2) UserControl                                               ...

  5. [转]在WPF中自定义控件 UserControl

    在这里我们将将打造一个UserControl(用户控件)来逐步讲解如何在WPF中自定义控件,并将WPF的一些新特性引入到自定义控件中来.我们制作了一个带语音报时功能的钟表控件, 效果如下: 在VS中右 ...

  6. WPF中的事件列表 .

    以下是WPF中的常见事件汇总表(按字母排序),翻译不见得准确,但希望对你有用. 事件 描述 Annotation.AnchorChanged 新增.移除或修改 Anchor 元素时发生. Annota ...

  7. WPF入门教程系列十八——WPF中的数据绑定(四)

    六.排序 如果想以特定的方式对数据进行排序,可以绑定到 CollectionViewSource,而不是直接绑定到 ObjectDataProvider.CollectionViewSource 则会 ...

  8. WPF中的数据绑定!!!

    引用自:https://msdn.microsoft.com/zh-cn/magazine/cc163299.aspx  数据点: WPF 中的数据绑定 数据点 WPF 中的数据绑定 John Pap ...

  9. WPF 中的 NameScope

    我们在 WPF 中使用绑定时可以使用 ElementName=Foo 这样的写法,并且还能够真的在运行时找到这个名称对应的对象,是因为 WPF 中提供了名称范围概念. 实现 INameScope 接口 ...

随机推荐

  1. Python3基本数据类型(三、列表)

    序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字-它的位置,或索引,第一个索引是0,第二个索引是1,以此类推.Python有6个序列的内置类型,但最常见的是列表和元组.序列都可以进 ...

  2. linux下使用libxml2实现对xml文件的读取及查询

    由于项目需要,这两天在用C++做XML文件解析的工作.在linux下有个很方便的操作xml文件的库——libxml2,它提供了一套创建和查询xml文件的C语言的接口.这篇博客主要介绍如何使用libxm ...

  3. win8中 用office 提示值不在预期的范围内

    原文:http://bbs.kafan.cn/thread-1401951-1-1.htmlhttp://bbs.kafan.cn/thread-1401951-1-1.html 错误如下: 名称:  ...

  4. 开始学习git

    今天看着廖雪峰的git使用教程开始学习git.不过没有将项目托管在github上,而是选择托管在了码云上. 看着明白做起来还是出了些问题,不过好在最后都解决了.果然眼高手低要不得. 试着将自己平时学习 ...

  5. 浅析内存对齐与ANSI C中struct型数据的内存布局-内存对齐规则

    这些问题或许对不少朋友来说还有点模糊,那么本文就试着探究它们背后的秘密. 首先,至少有一点可以肯定,那就是ANSI C保证结构体中各字段在内存中出现的位置是随它们的声明顺序依次递增的,并且第一个字段的 ...

  6. (第六场)Heritage of skywalkert 【玄学】

    题目链接:https://www.nowcoder.com/acm/contest/144/J 标题:J.Heritage of skywalkert | 时间限制:1 秒 | 内存限制:256M s ...

  7. 如何为WebStorm设置SASS的File Watchers?

    Webstorm是一个很牛叉的IDE,现在工作每天都是用它了. 最近开始用SASS,LESS等来写CSS,而在Webstorm中,它自带一个File Watchers功能,设置一下,即可实时编译SAS ...

  8. Spring多个版本源码地址分享

    源码地址为:http://repo.spring.io/simple/libs-release-local/org/springframework/spring/,以供研究源码的朋友. 我看了好几本关 ...

  9. js函数在frame中的相互的调用

    框架编程概述一个HTML页面可以有一个或多个子框架,这些子框架以<iframe>来标记,用来显示一个独立的HTML页面.这里所讲的框架编程包括框架的自我控制以及框架之间的互相访问,例如从一 ...

  10. Android学习笔记_16_添加多个Activity、参数传递、请求码和结果码使用

    一.添加新的Activity步骤: 第一步:新建一个继承Activity的类,如:NewActivity public class NewActivity extends Activity { @Ov ...