【问题标题】:Implenting ListCollectionView From ObservableCollection从 ObservableCollection 实现 ListCollectionView
【发布时间】:2016-09-20 00:17:01
【问题描述】:

我最近在 CodeReview (CodeReview Question) 上发布了一个问题,并按照他们的建议,我正在寻找从 ObservableCollection 移动到 ICollectionViewListCollectionView 而不是显然 ListCollectionView 具有更好的过滤性能.

我现在做的是这个;

Contracts = await ReturnContracts();
ContractsICollectionView = CollectionViewSource.GetDefaultView(Contracts);
DataContext = this;

其中ContractsObservableCollectionContractsICollectionViewICollectionView。当我改用 ListCollectionView 时,我得到了这个错误;

无法从 ICollectionView 转换为 ListCollectionView。

这里是ContractsContractsListCollectionView的定义;

public ObservableCollection<ContractModel> Contracts;
public ListCollectionView ContractsListCollectionView { get; private set; }

我的问题是如何实现ListCollectionView 并利用其改进的过滤功能?

【问题讨论】:

    标签: c# wpf filtering observablecollection


    【解决方案1】:

    只需像这样声明ContractsListCollectionView

    public ICollectionView ContractsListCollectionView { get; private set; }
    

    或者,如果你真的需要使用ListCollectionView 方法,而不仅仅是ICollectionView(注意ListCollectionView 实现ICollectionView),那么你需要进行转换:

    ContractsICollectionView = (ListCollectionView) CollectionViewSource.GetDefaultView(Contracts);
    

    请注意,虽然对于 ObservableCollection CollectionViewSource.GetDefaultView 确实返回 ListCollectionView - 对于其他集合类型,它可能不一样并且强制转换会失败。但是,由于您仅将它与 ObservableCollection 一起使用 - 投射很好。

    【讨论】:

    • 感谢您的回答。我正在尝试使用ListCollectionView,因为它明显提高了大型数据集的性能(我有大约 28000 家公司要过滤)。
    • 在上述两种方法中,underlying 类型都是 ListCollectionView。只是在第一种情况下,您通过接口(ICollectionView)访问它,在第二种情况下直接访问它。因此,如果您不直接使用它,例如只是将您的网格绑定到它 - 使用第一个方法。
    猜你喜欢
    • 2017-07-28
    • 1970-01-01
    • 2017-02-22
    • 2012-04-05
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多