CollectionViewSource、ICollectionView、ListCollectionView、IList 和 BindingListCollectionView 及其用例有啥区别?
Posted
技术标签:
【中文标题】CollectionViewSource、ICollectionView、ListCollectionView、IList 和 BindingListCollectionView 及其用例有啥区别?【英文标题】:What are the differences between CollectionViewSource, ICollectionView, ListCollectionView, IList and BindingListCollectionView and their use cases?CollectionViewSource、ICollectionView、ListCollectionView、IList 和 BindingListCollectionView 及其用例有什么区别? 【发布时间】:2013-06-17 08:11:56 【问题描述】:CollectionViewSource
、ICollectionView
、ListCollectionView
、IList
和 BindingListCollectionView
有什么区别?
何时何地使用所有这些集合?
我知道CollectionViewSource
的主要用途,但我不清楚何时使用这些,因为在 XAML 中我使用CollectionViewSource
进行分组、排序等,当我想要在代码隐藏中使用它时,我使用ListCollectionView
。
您能解释一下每种集合的确切区别和用例吗?
【问题讨论】:
你真的需要IList
解释吗?
@jon ,我知道 它表示可以通过索引单独访问的非通用对象集合 但我的问题是我不能使用普通 List(Of T),也许我错了,如果你解释这些事情的时间和地点以及这些事情之间的区别是什么,这将有助于我更好地理解。谢谢
@Selva generic List 是 IList 的具体实现。
【参考方案1】:
基本上,CollectionView 是一种在 WPF 中以最简单的方式构建 Master Ditail View 的方法。 首先给大家介绍一下fallback机制。
<Window.Resources>
<x:Array x:Key="planets" Type="x:Type local:Planets">
<local:Planets Name="Earth" Diameter="12,756 km" Mass="5.97 10^24kg" Density="5514 kg/m³"/>
<local:Planets Name="Mars" Diameter="6792 km" Mass="0.642 10^24kg" Density="3933 kg/m³"/>
<local:Planets Name="Jupiter" Diameter="142,984 km" Mass="1898 10^24kg" Density="1326 kg/m³"/>
</x:Array>
</Window.Resources>
<DockPanel DataContext="StaticResource planets">
<ListBox ItemsSource="Binding"
IsSynchronizedWithCurrentItem="True"
DisplayMemberPath="Name" Width="125"/>
<StackPanel>
<TextBlock Text="Binding Name"/>
<TextBlock Text="Binding Diameter"/>
<TextBlock Text="Binding Mass"/>
<TextBlock Text="Binding Density"/>
</StackPanel>
</DockPanel>
public class Planets
public string Name get; set;
public string Diameter get; set;
public string Mass get; set;
public string Density get; set;
我们有一个Planets
类型的简单数组。
DisplayMemberPath-Property 也设置了Name
,因此行星名称显示在ListBox
中。除了ListBox
,各个行星的详细信息都显示在TextBlock
中。 Vourla,我们有我们的工作主细节视图,通过后备机制隐式使用CollectionView
由于设置了IsSynchronizedWithCurrentItem="True"
属性,WPF会在后台生成Default-CollectioView
,并将ListBox
中选择的对象保存在CurrentItem-Property
中。现在的情况是TextBlock
的Binding
首先在Planets[]
数组上搜索Property
;它在那里找不到任何东西,但回退机制将其转发到Default-CollectionView
的CurrentItem-Property
。
也可以直接引用Default-CollectionView
的CurrentItem-Property
。为此,请在Binding
中的Property
前面做一个简单的(/)
。
<TextBlock Text="Binding /Name"/>
仅当设置了Binding
的Path-Property
时,回退机制才有效。
CollectionViewSource
派生自CollectionView
,是提供某些Properties
的代理,例如Source
或View
。
还有其他三个派生自CollectionView
的类,它们是ItemCollection
、ListCollectionView
和BindingListCollectionView
。 类的接口,即它们前面的类型(I)
,是为了避免与类直接耦合。遵循的原则称为依赖注入
三个类 ItemCollection
、ListCollectionView
和 BindingListCollectionView
是为不同的目的而设计的。 ItemCollection
因此提供了一个 IEnumerabl
e、ListCollectionView
一个 IList
和 BindingListCollectionView
一个 IBindingList
对象。因此,为不同的目的提供了不同的类型。
总而言之,CollectionView
是一个强大的 WPF 工具;您可以排序、分组等并显示详细信息。
我希望这可以进一步帮助您。问候迈克尔
【讨论】:
这有点吃亏,但我现在第一次看到这个问题是从2013年开始的。对不起,我只是一个初学者。我希望有人继续。以上是关于CollectionViewSource、ICollectionView、ListCollectionView、IList 和 BindingListCollectionView 及其用例有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 CollectionViewSource.SortDescriptions 排序很慢?
python pandas Data.Frame -- iloc和loc以及icol
CollectionViewSource,如何过滤数据?