Entity Framework 4.0 Databinding със сортиране не работи

Искам да направя нещо, което мислех, че ще бъде много просто. Искам да свържа генерирана 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 или Link-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