已过滤的CollectionView给出错误计数

问题描述:

根据documentation,已过滤的CollectionView的计数应该只是通过过滤器的项目的计数。鉴于此代码:已过滤的CollectionView给出错误计数

List<string> testList = new List<string>(); 
testList.Add("One"); 
testList.Add("Two"); 
testList.Add("Three"); 
testList.Add("1-One"); 
testList.Add("1-Two"); 
testList.Add("1-Three"); 
CollectionView testView = new CollectionView(testList); 
int testCount1 = testView.Count; 
testView.Filter = (i) => i.ToString().StartsWith("1-"); 
int testCount2 = testView.Count; 

因此,我要想到testCount1为6,和testCount2为3。然而,无论是6.如果我手动循环访问的CollectionView和计数的项目,我得到3,但Count始终返回6。

我试着在CollectionView上调用刷新,只是为了看看是否会纠正结果,但没有改变。文档是否错误? CollectionView中有错误吗?我做错了什么,我只是看不到?

+0

这必须工作,但我不知道:testview.OfType ().Count() – vorrtex 2011-04-11 22:22:31

似乎有一个错误,我检查反射器可能是如果你尝试调用“刷新”,应该给你正确的计数。根据文档,他们说你不需要调用Refresh,因为设置过滤器会自动刷新它,但我认为这不会发生,因为他们还提到他们缓存最后一次更改的计数值。

如果您在添加项目之前设置了过滤器,它将会很完美。或者你将不得不打电话刷新。

+0

我试着改变它来调用Refresh(),但是这并没有改变任何东西。 – 2011-04-11 17:15:38

尝试

ICollectionView _cvs = CollectionViewSource.GetDefaultView(testList); 

,而不是

CollectionView testView = new CollectionView(testList);  
+0

Actualy,即使上面的解决方案在您的情况下返回正确数量的结果,但如果您在过滤器后调试收集视图的“原始结果”,则尽管count属性仍然是6,但仍有3个项目。 – Bruno 2011-04-11 16:33:08

+0

+1,使用'CollectionViewSource.GetDefaultView'是正确的方法。 – user7116 2011-04-11 16:36:36

+0

CollectionViewSource.GetDefaultView所做的就是在内部映射中创建一个ListCollectionView并将其缓存。此外,这给你一个基础集合的全局CollectionView,我绝对不希望 - 我肯定试图获得本地实例。 – 2011-04-11 17:15:17

如果切换到ListCollectionView的,那么它将按预期工作:

CollectionView testView = new ListCollectionView(testList); 
int testCount1 = testView.Count; 
testView.Filter = (i) => i.ToString().StartsWith("1-"); 
int testCount2 = testView.Count; 

这似乎为的CollectionView工作,所以这肯定指向一个bug:

CollectionView testView = new CollectionView(this.GetTestStrings()); 

private IEnumerable<string> GetTestStrings() { 
    yield return "One"; 
    yield return "Two"; 
    yield return "Three"; 
    yield return "1-One"; 
    yield return "1-Two"; 
    yield return "1-Three"; 
} 
+0

+1,另外,'CollectionViewSource.GetDefaultView'将确保检索到正确的'CollectionView'。 – user7116 2011-04-11 16:36:15

+0

@sixlettervariables - 是的,这就是为什么我upvoted布鲁诺的答案;-) – CodeNaked 2011-04-11 16:37:10

+0

但是,如果我的源列表不执行IList(例如,如果我有一个集合),那么我不能使用ListCollectionView,我必须使用基础CollectionView。 – 2011-04-11 17:13:35