CollectionView

CollectionView是什么

支持很多高级操作,比如排序,分组,过滤等的视图,它是对数据附加了 当前项、排序、等属性的的视图。扩展了数据,又不会改变数据。

CollectionView怎么用

事实上当你将后台数据列表绑定到一个列表控件时,WPF为了默默地在数据列表和列表控件之间增加了层CollectionView。
一组数据可以有多个CollectionView。

当我们操作ListBox的Items时,比如直接在Items集合种添加数据,实际上是在操作数据的集合。
当我们通过ItemsSource指定数据源时,WPF会自动插入一个CollectionView。(这也是为何不能同时使用Items和ItemsSource的原因)。
使用代码手动创建CollectionView:

  1. CollectionView cv = new CollectionView(myList);
  2. this.listBox.ItemsSource = cv;

CollectionViewSource

CollectionViewSource是什么

CollectionViewSource是CollectionView的一个XAML代理。
它与CollectionView的基本关系是”HAS A”。CollectionViewSource拥有一个CollectionView类型的View属性来指定其对应的CollectionView对象,与之对应的,其还有一个Source属性,来指明数据来源.
一个简单的流程是:

  1. 将数据列表绑定到CollectionViewSource的Source属性,
  2. 然后将列表控件的ItemsSource属性绑定到CollectionViewSource的View属性.


  1. <Window.Resources>
  2. <XmlDataProvider x:Key="Employees" XPath="/Employees/*">
  3. <x:XData>
  4. <Employees xmlns="">
  5. <Employee Name="Terry Adams" Type="FTE" EmployeeNumber="1" />
  6. <Employee Name="Claire O&apos;Donnell" Type="FTE" EmployeeNumber="12345" />
  7. <Employee Name="Palle Peterson" Type="FTE" EmployeeNumber="5678" />
  8. <Employee Name="Amy E. Alberts" Type="CSG" EmployeeNumber="99222" />
  9. <Employee Name="Stefan Hesse" Type="Vendor" EmployeeNumber="-" />
  10. </Employees>
  11. </x:XData>
  12. </XmlDataProvider>
  13. <CollectionViewSource x:Key="cvs" Source="{Binding Source={StaticResource Employees}, XPath=/Employees/*}">
  14. <CollectionViewSource.SortDescriptions>
  15. <!--在这里插入排序描述-->
  16. </CollectionViewSource.SortDescriptions>
  17. <CollectionViewSource.GroupDescriptions>
  18. <!--在这里插入分组描述-->
  19. </CollectionViewSource.GroupDescriptions>
  20. </CollectionViewSource>
  21. <DataTemplate DataType="Employee">
  22. <TextBlock Text="{Binding XPath=@Name}" />
  23. </DataTemplate>
  24. </Window.Resources>
  25. <StackPanel>
  26. <ListBox ItemsSource="{Binding Source={StaticResource cvs}}" x:Name="lb"/>
  27. </StackPanel>