有一个 ObservableCollection。它包含具有 INotifyPropertyChanged 接口的对象。超过 40 吨的物体。该对象有大约 30 个字段。有一个谓词,一个过滤器,它接受一个对象并通过当前选择的其他谓词(过滤器)的集合,这不是主要的事情。
在一分钟内,变化可能来自外部——从 100 到 2000 个变化的对象。我的 ObservableCollection 在 ListCollectionView 中。每当发生变化时,请执行 Refresh() - 贪婪而缓慢地,然后选择在此之后下降。如何仅跟踪一个对象的更改并仅对其应用谓词,而不刷新整个集合。问题是所有这些都是用 .net 4.0 编写的
我的虚拟机:
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;}
}
}
确实,之前的方案不适合 .NET Framework 4.0 这种情况,建议你自己实现,尽量简单
INotifyCollectionChanged。作为输入,它将接受 original
ObservableCollection<T> where T: INotifyPropertyChanged和 predicateFunc<T,bool>,订阅集合本身的更改(添加新元素)以及PropertyChanged每个元素的事件。如果从原始集合中删除了一个元素,则停止返回它(可能,您将拥有某种线程安全集合形式的缓存 - 从中删除),取消订阅
PropertyChanged.如果将元素添加到原始集合中,则运行谓词。如果元素匹配条件,我们将其保存到本地缓存并解决我们自己的事件
CollectionChanged。如果它上升
PropertyChanged,我们通过过滤器运行对象。如果它不再满足条件,我们将其从缓存中删除并恢复我们自己的CollectionChanged.作者,首先将虚拟化列为清单。
其次,
ListCollectionView您有一个属性IsLiveFiltering,启用它,设置它,这应该可以解决您的问题而无需调用Refresh.