【问题标题】: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 的具体实现。

标签: c# wpf collectionviewsource icollectionview listcollectionview


【解决方案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年开始的。对不起,我只是一个初学者。我希望有人继续。
猜你喜欢
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 2021-02-11
相关资源
最近更新 更多