Имеется 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;}
}
}
Автор, во-первых включи виртуализацию для списка.
Во-вторых у ListCollectionView есть свойство IsLiveFiltering, включи его, настрой, и это должно решить твою проблему без необходимости вызова Refresh.
Действительно, предыдущее решение не подходит для .NET Framework 4.0
В этом случае, предлагаю вам реализовать собственную, максимально простую INotifyCollectionChanged.
На вход она будет принимать оригинальную ObservableCollection<T> where T: INotifyPropertyChanged и предикат Func<T,bool>, подписываться на изменения самой коллекции (добавление новых элементов) и на событие PropertyChanged каждого элемента.
Если элемент удаляется из оригинальной коллекции - вы перестаёте его возвращать (вероятно, у вас будет кэш в виде какой-то потокобезопасной коллекции - удаляем из него), отписываемся от PropertyChanged.
Если элемент добавляется в оригинальную коллекцию - запускается предикат. Если элемент соответсвует условию - сохраняем в локальный кэш и райсим собственное событие CollectionChanged.
Если райсистся PropertyChanged, прогоняем объект через фильтр. Если он перестал удовлетворять условию - удаляем из кэша и райсим собственное CollectionChanged.
Продвижение своими сайтами как стратегия роста и независимости