谈谈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;
<Window.Resources>
<XmlDataProvider x:Key="Employees" XPath="/Employees/*">
<x:XData>
<Employees xmlns="">
<Employee Name="Terry Adams" Type="FTE" EmployeeNumber="1" />
<Employee Name="Claire O'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>
<Window.Resources>
<XmlDataProvider x:Key="Employees" XPath="/Employees/*">
<x:XData>
<Employees xmlns="">
<Employee Name="Terry Adams" Type="FTE" EmployeeNumber="1" />
<Employee Name="Claire O'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)
原文:https://www.cnblogs.com/lonelyxmas/p/10652554.html