从ObservableCollection实现ListCollectionView

4

最近我在 CodeReview(CodeReview问题)上发布了一个问题,并且根据他们的建议,我正在从一个 ObservableCollection 移动到一个 ICollectionView,而不是一个 ListCollectionView,因为显然一个 ListCollectionView 有更好的过滤性能。

我现在做的是这样的;

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

在这里,ContractsObservableCollection,而ContractsICollectionViewICollectionView。当我使用ListCollectionView替换时,会收到以下错误:

无法将ICollectionView转换为ListCollectionView。

下面是ContractsContractsListCollectionView的定义;

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

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

1个回答

2

只需像这样声明ContractsListCollectionView:

public ICollectionView ContractsListCollectionView { get; private set; }

如果您确实需要使用ListCollectionView方法,而不仅仅是ICollectionView(请注意,ListCollectionView实现了ICollectionView),那么您需要进行类型转换:

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

请注意,对于 ObservableCollection 而言,CollectionViewSource.GetDefaultView 确实会返回 ListCollectionView,但对于其他集合类型可能不同,并且转换将失败。 但是,由于您只使用它与 ObservableCollection - 所以转换是可以的。

谢谢你的回答。我正在尝试使用ListCollectionView,因为它在处理大型数据集时似乎具有更高的性能(我需要过滤约28000个公司)。 - CBreeze
在上述两种方法中,_underlying_类型将是ListCollectionView。只是在第一种情况下,您通过接口(ICollectionView)访问它,在第二种情况下直接访问。因此,如果您不直接使用它,例如只是将网格绑定到它-请使用第一种方法。 - Evk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接