5

CustomSort を実装しようとしている DataGrid があります。DataGrid ItemsSource は常に並べ替え不可能な EnumerableCollectionView の型で返されます。CustomSort メソッドを実装できるように、EnumerableCollectionView を ListCollectionView に変換しようとしています。基礎となるコレクションは 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は ですListCollectionViewが、LINQ クエリの結果はEnumerableCollectionViewです。

于 2012-09-14T19:29:19.010 に答える