已过滤的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中有错误吗?我做错了什么,我只是看不到?
似乎有一个错误,我检查反射器可能是如果你尝试调用“刷新”,应该给你正确的计数。根据文档,他们说你不需要调用Refresh,因为设置过滤器会自动刷新它,但我认为这不会发生,因为他们还提到他们缓存最后一次更改的计数值。
如果您在添加项目之前设置了过滤器,它将会很完美。或者你将不得不打电话刷新。
我试着改变它来调用Refresh(),但是这并没有改变任何东西。 – 2011-04-11 17:15:38
尝试
ICollectionView _cvs = CollectionViewSource.GetDefaultView(testList);
,而不是
CollectionView testView = new CollectionView(testList);
Actualy,即使上面的解决方案在您的情况下返回正确数量的结果,但如果您在过滤器后调试收集视图的“原始结果”,则尽管count属性仍然是6,但仍有3个项目。 – Bruno 2011-04-11 16:33:08
+1,使用'CollectionViewSource.GetDefaultView'是正确的方法。 – user7116 2011-04-11 16:36:36
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";
}
这必须工作,但我不知道:testview.OfType