Основная часть моего вопроса в заголовке: Does WPF DataGrid Implicitly Convert IEnumerable < X> ItemsSource to List < x>?ли WPF DataGrid неявно преобразовывать IEnumerable <x> в список <x> При привязке?
У меня есть 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 (т. Е. Попытки перечислить после того, как контекст был удален).
Кроме того, у меня есть аналогичный код, который имеет преобразование .ToList() внутри метода, аналогичного GetAllPlans(). Нечто подобное, но не фактический код:
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 в список как часть процесса привязки. Это правда? И если да, существует ли способ избежать неявного преобразования?
сетка данных не выполняет такие преобразования, она просто пытается перечислить данные, используя соответствующий просмотр коллекции. – pushpraj
Umm .. это больше похоже на заполнение IEnumerable при привязке. – bit
AFAIK DataGrid будет ** не ** конвертировать 'IEnumerable' в 'Список '. –
Sandesh