Entity Framework 4.0 Привязка данных с сортировкой не работает

Я хочу сделать что-то, что, как я думал, будет очень простым. Я хочу привязать созданную Entity Framework EntityCollection к WPF DataGrid. Я также хочу, чтобы эта сетка была сортируемой.

Я пробовал всевозможные вещи, чтобы это произошло, в том числе с помощью CollectionViewSource. Однако, похоже, ничего не работает. Использование обычного CollectionViewSource вокруг EntityCollection дает мне:

'System.Windows.Data.BindingListCollectionView' view does not support sorting.

Хорошо... странно. Я бы подумал, что это сработает. Далее в CollectionViewSource я пытаюсь установить:

 CollectionViewType="ListCollectionView"

Отлично, сортировка теперь работает. Но подождите, теперь я не могу добавлять или удалять сущности с помощью сетки, предположительно потому, что ListCollectionView не поддерживает это с контекстом структуры сущностей.

Итак, я думаю, мне нужно фиксировать события, исходящие из сетки данных, чтобы вручную добавлять или удалять сущности из моего контекста. Теперь я не могу найти событие для захвата, чтобы обнаружить добавление...!

Почему это так сложно? Это должен быть стандартный «демонстрационный» случай, который должна была разработать Microsoft.

Любые идеи?


person Mike Gates    schedule 23.04.2010    source источник


Ответы (2)


BindingListCollectionView не является прямой проблемой. См. ' Представление System.Windows.Data.BindingListCollectionView не поддерживает сортировку в Microsoft Connect, чтобы узнать, почему оно не поддерживает сортировку.

С другой стороны, ListCollectionView поддерживает сортировку, очевидно, с использованием другого метода.

Я также пробовал следующий код, и он работал прекрасно. Я в основном реализовал ваш XAML из другого поста в коде.

 DatabaseContext.ObjectStateManager.ObjectStateManagerChanged += (o, args) => Debug.WriteLine(args.Element.ToString());

 var collectionViewSource = new CollectionViewSource();
 ((ISupportInitialize)collectionViewSource).BeginInit();
 collectionViewSource.CollectionViewType = typeof (ListCollectionView);
 collectionViewSource.Source = ((IListSource) DatabaseContext.Survey).GetList();
 collectionViewSource.SortDescriptions.Add(new SortDescription {PropertyName = "Name"});
 ((ISupportInitialize)collectionViewSource).EndInit();

 var editableCollectionView = (IEditableCollectionView)collectionViewSource.View;
 var survey = editableCollectionView.AddNew();

 // Before this point ObjectStateManager event has occurred and Debug Output is written to.

 editableCollectionView.CommitNew();
 DatabaseContext.SaveChanges(); // THIS WORKS TOO!

Мой DatabaseContext.Survey - это ObjectQuery<Survey>. Вы показываете запрос ObjectQuery или Linq-to-EF? Первое, очевидно, работает для меня. В последнем я вижу проблему. Это не должно работать.

person wpfwannabe    schedule 27.04.2010
comment
Да, ListCollectionView действительно работает. Я был сбит с толку, потому что добавление к этому через привязку данных не добавляло к тому, что я считал корневыми коллекциями, к которым я привязывался (например, myContext.Employees). Я ошибался, думая, что это изменяемые коллекции, хотя на самом деле это не так, и единственный способ получить доступ к моим новым сущностям — через ObjectStateManager. - person Mike Gates; 27.04.2010
comment
Это действительно работает отлично. Печально, что стандартный EF RAD не заботится об этом. Тем не менее, помните, что если вы используете ListCollectionView CollectionViewType с EF4, вам придется установить для AutoGenerateColumns значение False, чтобы избежать получения столбцов EntityState и EntityKey. - person Spooles; 11.04.2012

Похоже, View просто не получает уведомления, когда происходят изменения. Итак, я просто делаю

myCollectionViewSource.View.Refresh(); //refresh CollectionViewSource of CollectionViewType="ListCollectionView"

после добавления/удаления элементов списка.

Но затем все состояние обновляется (например, вам нужно снова сбросить предварительно выбранную сортировку). Вам нужно проверить, соответствует ли это вашим потребностям.

person OneWorld    schedule 15.01.2013