Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF DataGrid是否隐式转换IEnumerable<;x>;列出<;x>;什么时候装订?_C#_Wpf_Mvvm_Data Binding_Wpfdatagrid - Fatal编程技术网

C# WPF DataGrid是否隐式转换IEnumerable<;x>;列出<;x>;什么时候装订?

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

我的大部分问题都在标题中: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();
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将枚举集合以获取行计数之类的内容,因此这将花费同样长的时间。