微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

IEnumerable 到 ObservableCollection 失败

如何解决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 举报,一经查实,本站将立刻删除。