Entity Framework 4.0 Привязка данных с сортировкой не работает - PullRequest
6 голосов
/ 24 апреля 2010

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

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

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

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

 CollectionViewType="ListCollectionView"

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

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

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

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2010

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? Первое очевидно работает для меня. Последний, где я вижу проблему. Это не должно работать.

0 голосов
/ 15 января 2013

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...