我是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.
有任何帮助吗? 谢谢: - )
答案 0 :(得分:2)
以下是我的理解:
你的第一行:
ObservableCollection<Person> PersonsCollection = new ObservableCollection<Person>();
正如你正确地说,正在创建Persons
的可观察集合,你可以直接绑定到这个集合(技术上我相信你绑定到默认的CollectionView
)和你的DataGrid
将收到有关集合更改的通知,并相应更新。但是您需要对数据进行排序的附加功能。
所以,你的第二行:
ICollectionView PersonsView = CollectionViewSource.GetDefaultView(PersonsCollection);
使用GetDefaultView
为您的CollectionView
返回默认PersonsCollection
,CollectionView
是现有馆藏的包装,可以为您提供其他行为,例如过滤,分组,导航和排序。当一个集合绑定在WPF中时,绑定是一个CollectionView
对象,这些视图在数据排序和显示等时被操纵。
恰好是这种情况的默认类型CollectionViewSource
是ListCollectionView
,但由于这可能会因您传递给{{1}的对象类型而异,该方法返回一个接口CollectionViewSource.GetDefaultView()
。
所以在这一点上,我们可以使用ICollectionView
,ICollectionView
作为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对象是默认视图 对象
剩下的就是罚款,我很好,所以不需要评论。
答案 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.