【问题标题】:Does WPF DataGrid Implicitly Convert IEnumerable<x> to List<x> When Binding?WPF DataGrid 是否在绑定时将 IEnumerable<x> 隐式转换为 List<x>?
【发布时间】:2014-09-22 04:37:12
【问题描述】:

我的大部分问题都在标题中:WPF DataGrid 是否将 IEnumerable ItemsSource 隐式转换为 List

我有一个 WPF,使用 MVVM 等。ViewModel 属性定义为 ...

    private IEnumerable<Plan> _PlanListItems;
    public IEnumerable<Plan> PlanListItems
    {
        get { return _PlanListItems; }
        protected set { RaiseAndSetIfChanged(ref _PlanListItems, value); }
    }

    // ...
    // in some method
    OpenPlanItems = await service.GetAllPlansAsync();

服务中...

    public IEnumerable<Plan> GetAllPlans()
    {
        using (MyEntities ent = new MyEntities())
        {
            return (from a in ent.DbPlans select a)
                .AsEnumerable()
                .Select(o => o.Convert());   // Does some stuff to convert DbPlan entity into Plan class
        }
    }

    public async Task<IEnumerable<Plan>> GetAllPlansAsync()
    {
        return await Task.Run(() => GetAllPlans());
    }

在 XAML 中 ...

    <DataGrid ItemsSource="{Binding PlanListItems}"  ...>

这会引发异常:操作无法完成,因为 DbContext 已被释放错误。 Another question 表示原因可能是由于 IEnumerable 对象上的延迟执行(即在释放上下文后尝试枚举)。

此外,我有类似的代码,在类似于 GetAllPlans() 的方法中具有 .ToList() 转换。像这样的东西,但不是实际的代码:

    public List<Plan> GetAllPlans()
    {
        using (MyEntities ent = new MyEntities())
        {
            return (from a in ent.DbPlans select a)
                .AsEnumerable()
                .Select(o => o.Convert()).ToList();   // Does some stuff to convert ...
        }
    }

结果证明这是一种缓慢的方法(>5 秒)。当我删除 .ToList() 转换时,它会将时间降低到

这使我相信 WPF DataGrid 将 IEnumerable 绑定项隐式转换为 List 作为绑定过程的一部分。真的吗?如果是这样,有没有办法避免隐式转换?

【问题讨论】:

  • 数据网格不执行此类转换,它只是尝试使用适当的集合视图枚举数据。
  • 嗯.. 它更像是在绑定时填充 IEnumerable..
  • AFAIK DataGrid 将不会IEnumerable&lt;T&gt; 转换为List&lt;T&gt;
  • ToList() 枚举需要 5s 的集合。数据网格将枚举集合以获取诸如行数之类的信息,因此这将花费同样长的时间。

标签: c# wpf mvvm data-binding wpfdatagrid


【解决方案1】:

IEnumerable&lt;T&gt; 服务需要 DbContext has been disposed of 错误。

这就是为什么当您的服务上有 .ToList() 时需要更长的时间:因为它实际上返回数据。您可以在客户端上真正使用的真实数据,而不必担心上下文的范围。

DataGrid 只需要它的ItemsSource 集合来实现IEnumerable 接口,因此它可以在需要时枚举项目。它本身并不是“将事物转换为列表”,它只是枚举集合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-17
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    相关资源
    最近更新 更多