C# WPF DataGrid是否隐式转换IEnumerable<;x>;列出<;x>;什么时候装订?
我的大部分问题都在标题中:WPF DataGrid是否隐式地将IEnumerable ItemsSource转换为List 我有一个WPF,使用MVVM等。ViewModel属性定义为C# WPF DataGrid是否隐式转换IEnumerable<;x>;列出<;x>;什么时候装订?,c#,wpf,mvvm,data-binding,wpfdatagrid,C#,Wpf,Mvvm,Data Binding,Wpfdatagrid,我的大部分问题都在标题中:WPF DataGrid是否隐式地将IEnumerable ItemsSource转换为List 我有一个WPF,使用MVVM等。ViewModel属性定义为 private IEnumerable<Plan> _PlanListItems; public IEnumerable<Plan> PlanListItems { get { return _PlanListItems; } pro
private IEnumerable<Plan> _PlanListItems;
public IEnumerable<Plan> PlanListItems
{
get { return _PlanListItems; }
protected set { RaiseAndSetIfChanged(ref _PlanListItems, value); }
}
// ...
// in some method
OpenPlanItems = await service.GetAllPlansAsync();
private IEnumerable\u PlanListItems;
公共IEnumerablePlanListItems
{
获取{return\u PlanListItems;}
受保护集{RaiseAndSetIfChanged(ref _PlanListItems,value);}
}
// ...
//以某种方式
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());
}
public IEnumerable GetAllPlans()
{
使用(MyEntities ent=new MyEntities())
{
返回(从ent.DbPlans中的a选择a)
.可计算的()
.Select(o=>o.Convert());//执行一些操作将DbPlan实体转换为Plan类
}
}
公共异步任务GetAllPlansAsync()
{
返回等待任务。运行(()=>GetAllPlans());
}
在XAML中
<DataGrid ItemsSource="{Binding PlanListItems}" ...>
这会引发异常:操作无法完成,因为DbContext已被释放错误。指示原因可能是由于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 ...
}
}
公共列表GetAllPlans()
{
使用(MyEntities ent=new MyEntities())
{
返回(从ent.DbPlans中的a选择a)
.可计算的()
.Select(o=>o.Convert()).ToList();//执行一些转换操作。。。
}
}
结果证明这是一种缓慢的方法(>5秒)。当我删除.ToList()转换时,它将时间缩短到您的
IEnumerable
服务需要<0.2秒才能返回的原因是它实际上并没有返回数据:它返回的更多是“当您真正感兴趣时,如何获取数据”。它实际上只会在您对数据进行迭代或以其他方式访问它时提供数据。如果客户机代码试图利用上下文范围之外的“如何获取数据”,则这将为您提供DbContext has disposed
错误
这就是为什么当您的服务上有.ToList()
时需要更长时间的原因:因为它实际上是在返回数据。您可以在客户端上真正使用真实数据,而不必担心上下文的范围
DataGrid
只需要它的ItemsSource
集合来实现IEnumerable
接口,这样它就可以在需要时枚举项。它本身不是“将事物转换为列表”,它只是枚举集合 数据网格不执行这种转换,它只是尝试使用适当的集合视图枚举数据。。它更像是在绑定时填充IEnumerable..AFAIK数据网格不会将IEnumerable
转换为List
。ToList()枚举需要5秒的集合。datagrid将枚举集合以获取行计数之类的内容,因此这将花费同样长的时间。