我想做一些我认为非常简单的事情。我想将生成的Entity Framework EntityCollection绑定到WPF DataGrid。我也希望这个网格可以排序。
我尝试过各种各样的事情,包括使用CollectionViewSource。然而,似乎没有任何作用。使用EntityCollection周围的普通CollectionViewSource给出了:
'System.Windows.Data.BindingListCollectionView' view does not support sorting.
好的...奇怪。我原以为这会起作用。接下来在CollectionViewSource上,我尝试设置:
CollectionViewType="ListCollectionView"
很好,排序现在有效。但是等等,我现在无法使用网格添加或删除实体,大概是因为ListCollectionView不支持实体框架上下文。
所以,我想我需要捕获来自datagrid的事件,以便从我的上下文中手动添加或删除实体。现在我找不到要捕获的事件来检测添加...!
为什么这么难?这应该是微软应该设计的标准“演示”案例。
有什么想法吗?
答案 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.Survey
是ObjectQuery<Survey>
。您是在显示ObjectQuery
还是Linq-to-EF查询?前者显然对我有用。后者是我看到问题的地方。这不应该有效。
答案 1 :(得分:0)
看起来,当chages发生时,View才会收到通知。所以,我只是做
myCollectionViewSource.View.Refresh(); //refresh CollectionViewSource of CollectionViewType="ListCollectionView"
添加/删除列表项后。
然后整个状态得到刷新(例如,你必须重新重置预先选择的排序)。如果符合您的需要,您需要检查。