Имеется 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
.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Здравствуйте, не подскажите библиотеки для реализации видеопроигрывателя с облакаА то что-то в тупиковой ситуации
Как прервать закачку файла в режиме Streamed? StreamDispose() не помогает, сервер всё равно скачивает полностью файл, даже если я не прочитал из потока...
При изучение системы компоновки WPF у меня возникла куча вопросов, мне казалось что я разобрался с ними, до того момента пока не попытался сам...
Имеется 10 изображений в окне без рамки WPF формыКак мне их разместить так, чтобы можно было из другой формы растягивать сразу все изображения...