如何解决IEnumerable 到 ObservableCollection 失败
我有一个通用类,用于在 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 举报,一经查实,本站将立刻删除。