Ограничение количества результатов, возвращаемых фильтром в ICollectionView - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть DataGrid в XAML (из приложения WPF) с канонической привязкой к ICollectionView. В модели представления я применяю фильтр как обычно (например, представьте условие даты рождения).

PeopleView = CollectionViewSource.GetDefaultView(People);
PeopleView.Filter = o => ((Person)o).birth >= selDateFrom && ((Person)o).birth <= selDateTo;
PeopleView.Refresh();

Где selDateFrom (selDateTo) - это вспомогательное поле другого свойства, связанного с пользователь DatePicker. У меня также есть пользовательский ввод, связанный с полем int, скажем, оно называется limit, и я хочу ограничить строки, уже отфильтрованные по указанному выше условию, максимумом limit.

Как я могу изменить этот код?

Что я пробовал

Я ожидаю найти решение, очень похожее на следующее, хотя оно не работает (оно не показывает любая линия в сетке).

PeopleView = CollectionViewSource.GetDefaultView(People);
int filterCount = 0;
PeopleView.Filter = o => 

    {
        bool ret =
            ((Person)o).birth >= selDateFrom && ((Person)o).birth <= selDateTo;
        if (ret)
        {
            filterCount++;
        }
        bool pass = filterCount <= limit;
        return ret && pass; 
    };
PeopleView.Refresh();

Я думаю, что ей не хватает совсем немного, но что именно я пропускаю? Отлаживая код в Visual Studio 2019, я вижу правильные логические значения, возвращаемые функцией Filter.

1 Ответ

0 голосов
/ 28 апреля 2020

A CollectionView не поддерживает ограничение количества элементов.

Что вам нужно сделать, это привязать к отфильтрованному ObservableCollection<Person>, из которого вы просто удаляете элементы, которые вам не нужны дисплей в представлении.

Сброс фильтра должен быть простым, как присвоение свойства исходной коллекции необработанной нефильтрованной коллекции и вызов события PropertyChanged.

Это было бы гораздо более простым и гибким решением, чем попытка используйте CollectionView для фильтрации элементов в модели представления.

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

Достаточно справедливо. Установите filterCount на 0 непосредственно перед тем, как вызвать Refresh() затем.

Редактировать: Как указано OP, чтобы сохранить сортировку по умолчанию (щелкнув заголовок столбца) , вы также должны обработать событие Sorting и сбросить там поле:

private void DataGrid_Sorting(object sender, DataGridSortingEventArgs e)
{
    filterCount = 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...