Подтвердить что ты не робот

Отфильтрованный 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 всегда.

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

4b9b3361

Ответ 1

Попробуйте

ICollectionView _cvs = CollectionViewSource.GetDefaultView(testList);

вместо

CollectionView testView = new CollectionView(testList);    

Ответ 2

Если вы переключаетесь на 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";
}

Ответ 3

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

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