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 【问题描述】:

CollectionViewSourceICollectionViewListCollectionViewIListBindingListCollectionView 有什么区别? 何时何地使用所有这些集合?

我知道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中。现在的情况是TextBlockBinding首先在Planets[]数组上搜索Property;它在那里找不到任何东西,但回退机制将其转发到Default-CollectionViewCurrentItem-Property。 也可以直接引用Default-CollectionViewCurrentItem-Property。为此,请在Binding 中的Property 前面做一个简单的(/)

<TextBlock Text="Binding /Name"/>

仅当设置了BindingPath-Property 时,回退机制才有效。

CollectionViewSource 派生自CollectionView,是提供某些Properties 的代理,例如SourceView

还有其他三个派生自CollectionView 的类,它们是ItemCollectionListCollectionViewBindingListCollectionView接口,即它们前面的类型(I),是为了避免与直接耦合。遵循的原则称为依赖注入

三个 ItemCollectionListCollectionViewBindingListCollectionView 是为不同的目的而设计的。 ItemCollection 因此提供了一个 IEnumerable、ListCollectionView 一个 IListBindingListCollectionView 一个 IBindingList 对象。因此,为不同的目的提供了不同的类型。

总而言之,CollectionView 是一个强大的 WPF 工具;您可以排序、分组等并显示详细信息。

我希望这可以进一步帮助您。问候迈克尔

【讨论】:

这有点吃亏,但我现在第一次看到这个问题是从2013年开始的。对不起,我只是一个初学者。我希望有人继续。

以上是关于CollectionViewSource、ICollectionView、ListCollectionView、IList 和 BindingListCollectionView 及其用例有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 CollectionViewSource.SortDescriptions 排序很慢?

python pandas Data.Frame -- iloc和loc以及icol

CollectionViewSource,如何过​​滤数据?

Pandas——ix 与 loc 与 iloc 与 icol 的区别

在 CollectionViewSource 上触发过滤器

[Wpf]在C#中添加 collectionViewSource