Отфильтрованный CollectionView дает неправильный счет - PullRequest
10 голосов
/ 11 апреля 2011

Согласно документации , количество отфильтрованного 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.

Я пытался вызвать Refresh для CollectionView, просто чтобы посмотреть, исправит ли это результат, но изменений не было. Документация неверна? Есть ли ошибка в CollectionView? Я делаю что-то неправильно, чего просто не вижу?

Ответы [ 3 ]

5 голосов
/ 11 апреля 2011

Попробуйте

ICollectionView _cvs = CollectionViewSource.GetDefaultView(testList);

вместо

CollectionView testView = new CollectionView(testList);    
3 голосов
/ 11 апреля 2011

Если вы переключитесь на 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";
}
0 голосов
/ 11 апреля 2011

Кажется, есть ошибка, я проверил рефлектор, может быть, если вы попытаетесь вызвать "Обновить", который должен дать вам правильный счетчик.Согласно документации, они говорят, что вам не нужно вызывать Refresh, поскольку настройка фильтра обновит его автоматически, но я думаю, что этого не происходит, поскольку они также упоминают, что они кэшируют значение count из последнего изменения.

Itбудет работать идеально, если вы установите фильтр, прежде чем добавлять элементы.Или вам придется позвонить Обновить.

...