2010-04-23 52 views
6

我想做一些我认为会很简单的事情。我想要将生成的Entity Framework EntityCollection绑定到WPF DataGrid。我也希望这个网格是可排序的。实体框架4.0与排序不起作用的数据绑定

我已经尝试了各种各样的事情来做到这一点,包括使用CollectionViewSource。然而,似乎没有任何工作。利用绕EntityCollection正常CollectionViewSource给我:

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

好......奇怪。我原以为这会奏效。接下来在CollectionViewSource上,我尝试设置:

CollectionViewType="ListCollectionView" 

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

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

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

任何想法?

回答

2

BindingListCollectionView不是直接的问题。有关详细信息,请参阅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查询?前者显然对我有用。后者是我看到问题的地方。这不应该工作。

+0

是的,ListCollectionView实际上工作。我很困惑,因为通过数据绑定来增加这个数据并没有增加我认为是我绑定到的“根”集合(例如myContext.Employees)。我错误地认为这些是可变的集合,事实上他们并不是这样,而唯一的方法是通过ObjectStateManager来获得我的“新”实体。 – 2010-04-27 13:13:29

+0

这的确看起来很好。很遗憾,默认的EF RAD的东西并没有考虑到这一点。也就是说,请记住,如果您在EF4中使用ListCollectionView CollectionViewType,则必须将AutoGenerateColumns设置为False,以避免获取EntityState和EntityKey列。 – Spooles 2012-04-10 22:59:37

0

看来,视图只是在chages发生时才会得到通知。所以,我只是做

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

添加/删除列表项后。

但是,然后整个状态得到刷新(例如,你必须重新设置预选排序)。你需要检查一下,如果这符合你的需求。