ICollectionView接口类型的变量

时间:2013-08-31 21:10:00

标签: c# wpf wpfdatagrid

我是WPF的新手,看起来我完全不了解C# 下面的代码应该为DataGrid提供排序数据。

以下是我难以理解的代码:

ObservableCollection<Person> PersonsCollection = new ObservableCollection<Person>();
//this one is easy: I create new collection for objects of class Person and I call it PersonsCollection  

ICollectionView PersonsView = CollectionViewSource.GetDefaultView(PersonsCollection);
//this one is more complicated. Does it mean that I create new object called PersonsView which I assume that implements ICollectionView interface?  

ListCollectionView personsView = PersonsView as ListCollectionView;  
//this one I do not understand. Why do we need it? How can we treat PersonsView as ListCollectionView?  

personsView.CustomSort = new PersonSorter();  
//here we assign object of PersonSorter class to do the sorting. Fine with me.  

dataGrid1.ItemsSource = personsView;
//and here we assign personsView as a ItemsSource for our DataGrid. Fine with me.

有任何帮助吗? 谢谢: - )

3 个答案:

答案 0 :(得分:2)

以下是我的理解:

你的第一行:

ObservableCollection<Person> PersonsCollection = new ObservableCollection<Person>();

正如你正确地说,正在创建Persons的可观察集合,你可以直接绑定到这个集合(技术上我相信你绑定到默认的CollectionView)和你的DataGrid将收到有关集合更改的通知,并相应更新。但是您需要对数据进行排序的附加功能。

所以,你的第二行:

ICollectionView PersonsView = CollectionViewSource.GetDefaultView(PersonsCollection);

使用GetDefaultView为您的CollectionView返回默认PersonsCollectionCollectionView是现有馆藏的包装,可以为您提供其他行为,例如过滤,分组,导航和排序。当一个集合绑定在WPF中时,绑定是一个CollectionView对象,这些视图在数据排序和显示等时被操纵。

恰好是这种情况的默认类型CollectionViewSourceListCollectionView,但由于这可能会因您传递给{{1}的对象类型而异,该方法返回一个接口CollectionViewSource.GetDefaultView()

所以在这一点上,我们可以使用ICollectionViewICollectionView作为PersonsView,但我们希望通过定义ItemsSource来定义自定义排序行为,可以在CustomSort上找到。

由于我们知道默认视图是ListCollectionView,我们可以相应地显式地转换ListCollectionView对象(第3行),然后设置所需的排序行为(第4行):

ICollectionView

希望一些知识渊博的用户能够指出我犯过的任何错误。

答案 1 :(得分:2)

  

这个很简单:我为Person类的对象创建了新的集合,我称之为PersonsCollection。

正确,但我想先澄清一些事情。您可以在此处使用任何集合,或者更准确地使用IEnumberable

ObservableCollection与普通IEnumerable的区别在于,第一个在集合中添加,删除或重新排序项目时会发出通知,而后者则不会。“/ p>

重要提示:有一点需要注意的是,无论是什么类型的集合,无论是IEnumberable还是ObservableCollection,当在绑定中使用该集合时,WPF都是如此系统在该集合(源)周围创建一个包装器,有点像默认的视图

该视图实现了ICollectionView。它保留当前项目的概念,并提供排序,导航,过滤和分组等功能。

此视图与集合(source)相关,因此如果您对同一个集合有多个绑定,那么所有这些绑定实际上都绑定到WPF系统创建的默认视图,因此它们会更新默认视图更新时一起使用。

我必须清楚最后一个重要的话题,因为它与未来的问题有关。

  

这个更复杂。这是否意味着我创建了一个名为PersonsView的新对象,我假设它实现了ICollectionView接口?

没有或至少不完全正确。您将获得将由WPF系统创建的默认视图的引用,这就是获取该对象的方法被称为GetDefaultView()而不是CreateDefaultView()的原因。

  

这个我不明白。我们为什么需要它?我们如何将PersonsView视为ListCollectionView?

我们真的不需要它,我们可以不用这条线。我们可以将PersonView视为ListCollectionView,因为

  

所有集合都有默认的CollectionView。适用于所有系列   在实现IList时,ListCollectionView对象是默认视图   对象

MSDN Documentation

剩下的就是罚款,我很好,所以不需要评论。

答案 2 :(得分:1)

ObservableCollection您正在创建一个ObservableCollection,用于触发CollectionChanged事件,即更改DP值。
ICollectionView您将从人员集合中创建视图,该视图将用于在WPF数据网格等中显示集合数据 ListCollectionview smilar到ICollectionView,但你可以对itmes等进行排序或过滤。

 personsView.CustomSort = new PersonSorter();  // depending on which Tech you are using for example it might be you are creating the sorting property Name.