【发布时间】:2014-09-22 04:37:12
【问题描述】:
我的大部分问题都在标题中:WPF DataGrid 是否将 IEnumerable
我有一个 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<T>转换为List<T>。 -
ToList() 枚举需要 5s 的集合。数据网格将枚举集合以获取诸如行数之类的信息,因此这将花费同样长的时间。
标签: c# wpf mvvm data-binding wpfdatagrid