实体框架4.0数据绑定与排序无法正常工作

时间:2010-04-23 22:59:39

标签: wpf entity-framework

我想做一些我认为非常简单的事情。我想将生成的Entity Framework EntityCollection绑定到WPF DataGrid。我也希望这个网格可以排序。

我尝试过各种各样的事情,包括使用CollectionViewSource。然而,似乎没有任何作用。使用EntityCollection周围的普通CollectionViewSource给出了:

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

好的...奇怪。我原以为这会起作用。接下来在CollectionViewSource上,我尝试设置:

 CollectionViewType="ListCollectionView"

很好,排序现在有效。但是等等,我现在无法使用网格添加或删除实体,大概是因为ListCollectionView不支持实体框架上下文。

所以,我想我需要捕获来自datagrid的事件,以便从我的上下文中手动添加或删除实体。现在我找不到要捕获的事件来检测添加...!

为什么这么难?这应该是微软应该设计的标准“演示”案例。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

BindingListCollectionView不是直接问题。有关Microsoft Connect不支持排序的详细信息,请参阅Microsoft Connect上的'System.Windows.Data.BindingListCollectionView' view does not support sorting

另一方面,ListCollectionView显然支持使用不同的技术进行排序。

我也尝试了以下代码,它工作得很漂亮。我基本上已经在代码中从the other post实现了您的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.SurveyObjectQuery<Survey>。您是在显示ObjectQuery还是Linq-to-EF查询?前者显然对我有用。后者是我看到问题的地方。这不应该有效。

答案 1 :(得分:0)

看起来,当chages发生时,View才会收到通知。所以,我只是做

myCollectionViewSource.View.Refresh(); //refresh CollectionViewSource of CollectionViewType="ListCollectionView"
添加/删除列表项后

然后整个状态得到刷新(例如,你必须重新重置预先选择的排序)。如果符合您的需要,您需要检查。