我有一个DataGrid,我正在尝试实现一个CustomSort。 DataGrid ItemsSource始终返回类型为EnumerableCollectionView,这是不可移植的。我正在尝试将EnumerableCollectionView转换为ListCollectionView,以便我可以在其上实现我的CustomSort方法。底层集合是ObservableDictionary。如何将EnumerableCollectionView转换为ListCollectionView或从ItemsSource返回ListCollectionView?
答案 0 :(得分:2)
结束我自己解决这个问题。我创建了一个新的List,它包含我的所有DataGridRows,然后根据我的DataGridRows列表创建一个新的ListCollectionView。然后,我根据新的List执行自定义排序,并将DataGrid的ItemsSource设置为ListCollectionView。
private void PerformCustomSort(DataGridColumn column) {
ListSortDirection direction = (column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending;
column.SortDirection = direction;
List<DataGridRow> dgRows = new List<DataGridRow>();
var itemsSource = dataGrid1.ItemsSource as IEnumerable;
foreach (var item in itemsSource) {
DataGridRow row = dataGrid1.ItemContainerGenerator.ContainerFromItem(item) as DataGridRow;
if (null != row) {
dgRows.Add(row);
}
}
ListCollectionView lcv = new ListCollectionView(dgRows);
SortOrders mySort = new SortOrders(direction, column);
lcv.CustomSort = mySort;
dataGrid1.ItemsSource = lcv;
}
这允许我避免使用EnumerableCollectionView并允许排序。
答案 1 :(得分:1)
我认为你的做法是错误的。您不要让DataGrid确定要使用哪种类型的集合,您自己显式创建集合并将DataGrid绑定到它。
您可能不需要通过强制转换ItemsSource来检索集合,您应该将其存储为ViewModel的属性,或者存储在代码隐藏中。
如果你真的需要从DataGrid中检索引用,只需像以下那样进行转换:
ListCollectionView myList = (ListCollectionView)dataGrid.ItemsSource;
但是在大多数情况下,如果你这样做,你可能会对你的代码结构做错了。
答案 2 :(得分:0)
使用较大集合中的set / subset可能会遇到问题。例如:
ItemsSource = dsJournals.Local.Where(j => j.Jrnl == "AAA");
dsJournals.Local
是ListCollectionView
,但LINQ查询的结果是EnumerableCollectionView
。