5

我有一个试图在其上实现 CustomSort 的 DataGrid。DataGrid ItemsSource 始终返回不可排序的 EnumerableCollectionView 类型。我正在尝试将 EnumerableCollectionView 转换为 ListCollectionView 以便我可以在其上实现我的 CustomSort 方法。底层集合是一个 ObservableDictionary。如何将 EnumerableCollectionView 转换为 ListCollectionView 或从 ItemsSource 返回 ListCollectionView?

4

3 回答 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 回答