我有一个试图在其上实现 CustomSort 的 DataGrid。DataGrid ItemsSource 始终返回不可排序的 EnumerableCollectionView 类型。我正在尝试将 EnumerableCollectionView 转换为 ListCollectionView 以便我可以在其上实现我的 CustomSort 方法。底层集合是一个 ObservableDictionary。如何将 EnumerableCollectionView 转换为 ListCollectionView 或从 ItemsSource 返回 ListCollectionView?
问问题
2094 次
3 回答
2
最终自己解决了这个问题。我创建了一个包含所有 DataGridRows 的新列表,然后基于我的 DataGridRows 列表创建了一个新的 ListCollectionView。然后,我根据新列表执行了我的自定义排序,并将 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 并允许排序。
于 2012-09-14T16:16:09.173 回答
1
我认为你的做法是错误的。您不要让 DataGrid 确定要使用哪种集合,而是自己显式创建集合并将 DataGrid 绑定到它。
您可能不需要通过强制转换 ItemsSource 来检索集合,您应该将其存储为 ViewModel 的属性,或者存储在代码隐藏中。
如果您确实需要从 DataGrid 中检索引用,只需将其转换为:
ListCollectionView myList = (ListCollectionView)dataGrid.ItemsSource;
但在大多数情况下,如果你这样做,你可能在代码结构上做错了。
于 2012-09-13T17:29:03.910 回答
0
您可能在处理较大集合中的集合/子集时遇到问题。例如:
ItemsSource = dsJournals.Local.Where(j => j.Jrnl == "AAA");
dsJournals.Local
是 aListCollectionView
但 LINQ 查询的结果是EnumerableCollectionView
.
于 2012-09-14T19:29:19.010 回答