2010-04-23 11 views
6

Ich möchte etwas tun, das ich dachte, wäre sehr einfach. Ich möchte eine generierte Entity Framework EntityCollection an ein WPF DataGrid binden. Ich möchte auch, dass dieses Raster sortierbar ist.Entity Framework 4.0 Datenbindung mit Sortierung funktioniert nicht

Ich habe alle möglichen Dinge versucht, um dies zu erreichen, einschließlich der Verwendung einer CollectionViewSource. Nichts scheint jedoch zu funktionieren. Die Verwendung einer normalen CollectionViewSource um die EntityCollection gibt mir:

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

Ok ... seltsam. Ich hätte gedacht, das würde funktionieren. Als nächstes auf der CollectionViewSource, ich versuche Einstellung:

CollectionViewType="ListCollectionView" 

Großartig, Sortierung funktioniert jetzt. Aber warten Sie, ich kann keine Entitäten jetzt mithilfe des Rasters hinzufügen oder entfernen, vermutlich weil ListCollectionView dies nicht mit einem Entitätsrahmenkontext unterstützt.

Also, ich denke, ich muss Ereignisse aus dem DataGrid erfassen erfassen, um Entitäten manuell aus meinem Kontext hinzufügen oder entfernen. Jetzt kann ich kein Ereignis finden, das erfasst werden kann, um ein Add zu erkennen ...!

Warum ist das so schwer? Dies sollte der Standard-Demo-Fall sein, den Microsoft hätte entwerfen sollen.

Irgendwelche Ideen?

Antwort

2

BindingListCollectionView ist nicht direkt das Problem. In Microsoft Connect finden Sie unter 'System.Windows.Data.BindingListCollectionView' view does not support sorting Informationen darüber, warum die Sortierung nicht unterstützt wird.

Auf der anderen Seite unterstützt ListCollectionView Sortierung offensichtlich mit einer anderen Technik.

Ich habe auch den folgenden Code ausprobiert und es hat wunderbar funktioniert. Ich habe im Grunde Ihr XAML von the other post in Code implementiert.

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! 

Mein DatabaseContext.Survey ist ein ObjectQuery<Survey>. Zeigen Sie eine ObjectQuery oder eine Linq-to-EF-Abfrage? Ersteres funktioniert offensichtlich für mich. Letzteres ist, wo ich ein Problem sehe. Das soll nicht funktionieren.

+0

Ja, die ListCollectionView funktioniert tatsächlich. Ich war verwirrt, weil das Hinzufügen über das Datenbinding nicht zu den "root" -Sammlungen, an die ich mich gebunden habe (z. B. myContext.Employees), hinzugefügt wurde. Ich habe mich geirrt, dass es sich um veränderliche Sammlungen handelte, obwohl sie es nicht waren, und der einzige Weg, um an meine "neuen" Entitäten zu gelangen, war der ObjectStateManager. –

+0

Das scheint wirklich gut zu funktionieren. Es ist traurig, dass das Standard-EF-RAD-Zeug sich nicht um die Box kümmert. Denken Sie jedoch daran, dass Sie bei Verwendung von CollectionViewType mit EF4 von ListCollectionView AutoGenerateColumns auf False festlegen müssen, damit die Spalten EntityState und EntityKey nicht abgerufen werden. – Spooles

0

Es scheint so, als würde die View nicht benachrichtigt, wenn Chages auftreten. Also, ich mache nur

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

nach Hinzufügen/Entfernen von Listenelementen.

Aber dann wird der gesamte Zustand aktualisiert (z. B. muss die vorgewählte Sortierung erneut zurückgesetzt werden). Sie müssen überprüfen, ob dies Ihren Bedürfnissen entspricht.

Verwandte Themen