使用DataGrids的EnumerableCollectionView到ListCollectionView

时间:2012-09-13 16:35:15

标签: c# wpf sorting datagrid collectionview

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

3 个答案:

答案 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.LocalListCollectionView,但LINQ查询的结果是EnumerableCollectionView