Mik*_*tes 6 wpf entity-framework
我想做一些我认为非常简单的事情.我想将生成的Entity Framework EntityCollection绑定到WPF DataGrid.我也希望这个网格可以排序.
我尝试过各种各样的事情,包括使用CollectionViewSource.然而,似乎没有任何作用.在EntityCollection周围使用普通的CollectionViewSource给了我:
'System.Windows.Data.BindingListCollectionView' view does not support sorting.
Run Code Online (Sandbox Code Playgroud)
好吧......奇怪.我原以为这会起作用.接下来在CollectionViewSource上,我尝试设置:
CollectionViewType="ListCollectionView"
Run Code Online (Sandbox Code Playgroud)
很好,排序现在有效.但是等等,我现在无法使用网格添加或删除实体,可能是因为ListCollectionView不支持实体框架上下文.
所以,我想我需要捕获来自datagrid的事件,以便从我的上下文中手动添加或删除实体.现在我找不到要捕获的事件来检测添加......!
为什么这么难?这应该是微软应该设计的标准"演示"案例.
有任何想法吗?
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!
Run Code Online (Sandbox Code Playgroud)
我的DatabaseContext.Survey是一个ObjectQuery<Survey>. 您显示的是ObjectQueryLinq-to-EF 查询吗?前者显然对我有用。后者是我看到问题的地方。那不应该起作用。