Я хочу сделать что-то, что я думал, будет очень просто. Я хочу связать сгенерированную Платформу Объекта EntityCollection с WPF DataGrid. Я также хочу, чтобы эта сетка была поддающейся сортировке.
Я попробовал все виды вещей заставить это произойти, включая использование CollectionViewSource. Однако ничто, кажется, не работает. Используя нормальный CollectionViewSource вокруг EntityCollection дает мне:
'System.Windows.Data.BindingListCollectionView' view does not support sorting.
Хорошо... странный. Я думал бы, что это будет работать. Затем на CollectionViewSource, я пытаюсь установить:
CollectionViewType="ListCollectionView"
Большой, сортируя теперь работает. Но ожидайте, я не могу добавить или удалить объекты с помощью сетки теперь, по-видимому, потому что ListCollectionView не поддерживает это с контекстом платформы объекта.
Так, я предполагаю, что должен получить события, выходящие из datagrid, чтобы добавить или удалить объекты вручную из моего контекста. Теперь я не могу найти, что событие получает для обнаружения добавления...!
Почему это настолько трудно? Это должно быть стандартным "демонстрационным" случаем, который Microsoft должна была разработать на основе.
Какие-либо идеи?
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
. Вы показываете ObjectQuery
или запрос Linq-to-EF? Первое, очевидно, работает для меня. В последнем я вижу проблему. Это не должно работать.