2014-09-22 12 views
0

我的问题大部分是在标题中:WPF DataGrid隐式转换IEnumerable < X> ItemsSource到列表< x>?是否WPF DataGrid隐式转换IEnumerable <x>到列表<x>当绑定?

我有一个WPF使用MVVM等视图模型属性定义为...

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()转换时,它将时间减少到< 0.2秒,但是当我将结果绑定到DataGrid时,效率降低(几乎完全相同的持续时间)。

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

+0

数据网格不执行此类转换,它仅尝试使用适当的收集视图枚举数据。 – pushpraj 2014-09-22 04:41:08

+0

嗯..它更像是在绑定时填充IEnumerable .. – bit 2014-09-22 04:41:26

+0

AFAIK DataGrid将**不会**将IEnumerable '转换为'List '。 – Sandesh 2014-09-22 05:58:59

回答

0

您的IEnumerable<T>服务需要< 0.2秒来返回的原因是因为它实际上并没有返回数据:它返回的是'如何获取数据,当您真正感兴趣时'。它只会在您迭代或以其他方式访问数据时才会向您提供数据。如果客户端代码试图利用'如何获取数据'超出上下文范围,那么这会给你带来DbContext has been disposed of错误。

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

DataGrid只需要它的ItemsSource集合来实现IEnumerable接口,因此它可以在需要时枚举项目。它本身不是“把东西变成清单”,它只是列举了这个集合。

相关问题