我的问题大部分是在标题中: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。真的吗?如果是这样,有没有办法避免隐式转换?
数据网格不执行此类转换,它仅尝试使用适当的收集视图枚举数据。 – pushpraj 2014-09-22 04:41:08
嗯..它更像是在绑定时填充IEnumerable .. – bit 2014-09-22 04:41:26
AFAIK DataGrid将**不会**将IEnumerable'转换为'List '。 –
Sandesh
2014-09-22 05:58:59