我想做一些我认为很简单的事情。我想将生成的 Entity Framework EntityCollection 绑定(bind)到 WPF DataGrid。我也希望这个网格是可排序的。
我已经尝试了各种方法来实现这一点,包括使用 CollectionViewSource。但是,似乎没有任何效果。在 EntityCollection 周围使用普通的 CollectionViewSource 会给我:
'System.Windows.Data.BindingListCollectionView' view does not support sorting.
好吧……奇怪。我原以为这会奏效。接下来在 CollectionViewSource 上,我尝试设置:
CollectionViewType="ListCollectionView"
太好了,排序现在有效。但是等等,我现在不能使用网格添加或删除实体,大概是因为 ListCollectionView 不支持 Entity Framework 上下文。
所以,我想我需要捕获来自数据网格的事件,以便从我的上下文中手动添加或删除实体。现在我找不到要捕获的事件来检测添加...!
为什么这么难?这应该是微软应该设计的标准“演示”案例。
有任何想法吗?
最佳答案
BindingListCollectionView
不是直接的问题。见 'System.Windows.Data.BindingListCollectionView' view does not support sorting在 Microsoft Connect 上了解为什么它不支持排序的详细信息。
另一方面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.Survey
是 ObjectQuery<Survey>
.您是否显示 ObjectQuery
还是 Linq-to-EF 查询?前者显然对我有用。后者是我看到问题的地方。那不应该工作。
关于wpf - Entity Framework 4.0 数据绑定(bind)与排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2702434/