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 (将#修改为@)