10

ドキュメントによると、フィルター処理された 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 で Refresh を呼び出してみましたが、変更はありませんでした。ドキュメントは間違っていますか?CollectionView にバグはありますか? 見えないだけで何か悪いことをしていますか?

4

3 に答える 3

5

試す

ICollectionView _cvs = CollectionViewSource.GetDefaultView(testList);

それ以外の

CollectionView testView = new CollectionView(testList);    
于 2011-04-11T16:25:10.390 に答える
3

ListCollectionView に切り替えると、期待どおりに動作します。

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

これは CollectionView で機能しているように見えるため、これは間違いなくバグを示しています。

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";
}
于 2011-04-11T16:25:28.500 に答える
0

バグがあるようです。「Refresh」を呼び出してみると、正しいカウントが得られるはずのリフレクターがある可能性があることを確認しました。ドキュメントによると、フィルターを設定すると自動的に更新されるため、 Refresh を呼び出す必要はないと彼らは言っていますが、最後の変更からカウントの値をキャッシュすることにも言及しているため、それは起こっていないと思います。

アイテムを追加する前にフィルターを設定すると、完璧に機能します。または、Refresh を呼び出す必要があります。

于 2011-04-11T16:15:40.170 に答える