Entity Framework 4.0 Databinding with sorting not working
I want to do something that I thought would be very simple. I want to bind a generated Entity Framework EntityCollection to a WPF DataGrid. I also want this grid to be sortable.
I have tried all kinds of things to make this happen, including using a CollectionViewSource. However, nothing seems to work. Using a normal CollectionViewSource around the EntityCollection gives me:
'System.Windows.Data.BindingListCollectionView' view does not support sorting.
Ok...strange. I would have thought this would work. Next on the CollectionViewSource, I try setting:
CollectionViewType="ListCollectionView"
Great, sorting now works. But wait, I can't add or remove entities using the grid now, presumably because ListCollectionView doesn't support this with an entity framework context.
So, I g开发者_运维知识库uess I need to capture events coming out of the datagrid in order to add or remove entities manually from my context. Now I can't find an event to capture to detect an add...!
Why is this so hard? This should be the standard "demo" case that Microsoft should have designed around.
Any ideas?
BindingListCollectionView
is not directly the problem. See 'System.Windows.Data.BindingListCollectionView' view does not support sorting on Microsoft Connect for details why it does not support sorting.
On the other hand ListCollectionView
supports sorting obviously using a different technique.
I have also tried the following code and it worked beautifully. I have basically implemented your XAML from the other post in code.
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!
My DatabaseContext.Survey
is an ObjectQuery<Survey>
. Are you showing an ObjectQuery
or a Linq-to-EF query? The former obviously works for me. The latter is where I see a problem. That is not supposed to work.
It seems like, the View just doesn't get notified, when chages occur. So, I just do
myCollectionViewSource.View.Refresh(); //refresh CollectionViewSource of CollectionViewType="ListCollectionView"
after add/remove of list items.
But then the whole state gets refreshed (e.g. you have to reset preselected sorting again). You need to check, if this fits your needs.
精彩评论