问题描述
我有一个通用类,用于在 ObservableCollections 上执行一些过滤操作 - 一个小的自定义分页机制。
public class Paginate<T> : INotifyPropertyChanged
{
public readonly ObservableCollection<T> all_data;
public ObservableCollection<T> filtered_data;
public Paginate(ObservableCollection<T> _data)
{
all_data = _data;
filtered_data = all_data;
}
public ObservableCollection<T> Filter(Func<T,bool> obj)
{
//Filter collection
//This takes about 10ms to finish - no errors at all
//var test = all_data.Where(obj).ToList();
//This doesn't finish at all,consuming a lot of memory
filtered_data = all_data.Where(obj).ToObservableCollection();
//...
return filtered_data;
}
}
我的问题是在 Filter 方法中,IEnumerable 到 ObservableCollection 的转换没有完成。但是,当 Linq 结果是少量记录时,它确实可以正确完成。这是我在 viewmodel 中调用所有内容的方式(按钮命令):
private void Filter_Execute(object parameter)
{
//Test_data is ObservableCollection<Student>,_paginate is instance of Paginate class
Test_data = _paginate.Filter(Filter_data);
//...
}
public bool Filter_data(object obj)
{
//Filtering logic
if (obj is Student student)
{
return ((string.IsNullOrEmpty(Name) ? true : student.NAME == Name)
& (string.IsNullOrEmpty(Surname) ? true : student.SURNAME == Surname)
& (string.IsNullOrEmpty(Age) ? true : student.AGE == Convert.ToInt16(Age))
);
}
return false;
}
以及我将 IEnumerable 转换为 ObservableCollection 的扩展方法:
public static ObservableCollection<T> ToObservableCollection<T> (this IEnumerable<T> source)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return new ObservableCollection<T>(source);
}
那么我在这里做错了什么?
更新
我的问题在于绑定到 DataGrid 时的 UI 端。显然,当 Linq 结果超过您在 UI 中显示的项目数时,您不能将 ScrollViewer.CanContentScroll 属性设置为 False。这以某种方式导致巨大的内存泄漏,并且不会停止。
我正在研究解决方案。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)