Живой фильтр ListCollectionView

383
09 августа 2017, 17:19

Имеется ObservableCollection. В нем лежат объекты с интерфейсом INotifyPropertyChanged. Объектов более 40т. Объект имеет порядка 30 полей. Имеется предикат, фильтр, который в себя берет объект и проходится по коллекции других предикатов (фильтров), которые в данный момент выбраны, это не главное.

В течении одной минуты, из вне, могут приходить изменения - от 100 до 2000 измененных объектов. Мой ObservableCollection лежит в ListCollectionView. Всякий раз когда приходят изменения делать Refresh() - жадно и медленно, и потом спадает после этого селект. Каким образом можно отслеживать только изменение одного объекта и применять только к нему предикат, а не делать рефреш всей коллекции. Проблема еще в том что все это пишется на .net 4.0

Моя VM:

public class TestVM : ViewModelBase
{
private Entity m_entity;
public Entity Entity
{
get{return m_entity;}
set
{
m_entity = value;
RaisePropertyChanged(string.Empty);
}
}
public string TestString
{
get{return m_entity.TestString;}
}
}
Answer 1

Автор, во-первых включи виртуализацию для списка.

Во-вторых у ListCollectionView есть свойство IsLiveFiltering, включи его, настрой, и это должно решить твою проблему без необходимости вызова Refresh.

Answer 2

Действительно, предыдущее решение не подходит для .NET Framework 4.0 В этом случае, предлагаю вам реализовать собственную, максимально простую INotifyCollectionChanged.

На вход она будет принимать оригинальную ObservableCollection<T> where T: INotifyPropertyChanged и предикат Func<T,bool>, подписываться на изменения самой коллекции (добавление новых элементов) и на событие PropertyChanged каждого элемента.

Если элемент удаляется из оригинальной коллекции - вы перестаёте его возвращать (вероятно, у вас будет кэш в виде какой-то потокобезопасной коллекции - удаляем из него), отписываемся от PropertyChanged.

Если элемент добавляется в оригинальную коллекцию - запускается предикат. Если элемент соответсвует условию - сохраняем в локальный кэш и райсим собственное событие CollectionChanged.

Если райсистся PropertyChanged, прогоняем объект через фильтр. Если он перестал удовлетворять условию - удаляем из кэша и райсим собственное CollectionChanged.

READ ALSO
Просмотр видео из облака (Google drive, yandex disk)

Просмотр видео из облака (Google drive, yandex disk)

Здравствуйте, не подскажите библиотеки для реализации видеопроигрывателя с облакаА то что-то в тупиковой ситуации

249
Как прервать закачку файла в режиме Streamed?

Как прервать закачку файла в режиме Streamed?

Как прервать закачку файла в режиме Streamed? StreamDispose() не помогает, сервер всё равно скачивает полностью файл, даже если я не прочитал из потока...

262
Создание производных классов WPF

Создание производных классов WPF

При изучение системы компоновки WPF у меня возникла куча вопросов, мне казалось что я разобрался с ними, до того момента пока не попытался сам...

326
Разметка изображений в WPF C#

Разметка изображений в WPF C#

Имеется 10 изображений в окне без рамки WPF формыКак мне их разместить так, чтобы можно было из другой формы растягивать сразу все изображения...

385