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'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>
此方法返回给定源的默认视图,这个是一个静态方法,可以直接使用var cv = CollectionViewSource.GetDefaultView(DataContext.Source);访问,返回一个ICollectionView的接口对象,其实就是一个CollectionView的视图。然后通过调用CollectionView的Filter()方法,实现排序、筛选等功能,具体代码如下:
其中,每一个src1中的item项都会执行FilterOutA()。
public Window1()
{
InitializeComponent();
object src1 = this.Resources["src1"];
ICollectionView collectionView = CollectionViewSource.GetDefaultView(src1);
collectionView.Filter = new Predicate<object>(FilterOutA);
}
public bool FilterOutA(object item)
{
GreekGod gg = item as GreekGod;
if ((gg == null) || gg.RomanName.StartsWith("A"))
{
return false;
}
else
{
return true;
}
}