使用排序的Entity Framework 4.0数据绑定不起作用

6

我希望做的事情看起来很简单。我想将生成的Entity Framework EntityCollection绑定到WPF DataGrid,并使此表格可排序。

我尝试了各种方法来实现这一点,包括使用CollectionViewSource。然而,似乎没有任何效果。在EntityCollection周围使用普通的CollectionViewSource会给我:

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

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

 CollectionViewType="ListCollectionView"

很好,现在排序已经可以正常工作了。但是等等,我现在无法使用网格添加或删除实体,可能是因为ListCollectionView在实体框架上下文中不支持此功能。

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

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

有任何想法吗?

2个回答

2
BindingListCollectionView并不是直接的问题。详见Microsoft Connect上的'System.Windows.Data.BindingListCollectionView' view does not support sorting,了解它为什么不支持排序。
另一方面,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 还是 Linq-to-EF 查询?前者对我来说显然有效。后者是我看到的问题所在。那不应该有效。


是的,ListCollectionView确实可以工作。我感到困惑的原因是通过数据绑定添加到它时,并没有添加到我认为的“根”集合中(例如myContext.Employees)。我错误地认为这些是可变集合,但实际上它们不是,获取“新”实体的唯一方法是通过ObjectStateManager。 - Mike Gates
这确实似乎很有效。遗憾的是,默认的EF RAD工具箱没有处理这个问题。话虽如此,要记住,如果您正在使用带有EF4的ListCollectionView CollectionViewType,则必须将AutoGenerateColumns设置为False,以避免获取EntityState和EntityKey列。 - Spooles

0

看起来,当更改发生时,视图似乎没有收到通知。所以我只需要

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

在列表项添加/删除后。

但是整个状态都会刷新(例如,您必须重新设置预选排序)。您需要检查是否符合您的需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接