CustomSort を実装しようとしている DataGrid があります。DataGrid ItemsSource は常に並べ替え不可能な EnumerableCollectionView の型で返されます。CustomSort メソッドを実装できるように、EnumerableCollectionView を ListCollectionView に変換しようとしています。基礎となるコレクションは ObservableDictionary です。EnumerableCollectionView を ListCollectionView に変換するか、ItemsSource から ListCollectionView を返すにはどうすればよいでしょうか?
3 に答える
これを自分で解決することになりました。すべての 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 を回避し、並べ替えを許可することができました。
私はあなたがそれについて間違った方法で行っていると思います。使用するコレクションの種類を DataGrid に決定させないでください。明示的に自分でコレクションを作成し、それに DataGrid をバインドします。
おそらく、ItemsSource をキャストしてコレクションを取得する必要はありません。ViewModel のプロパティとして、またはコード ビハインドに格納する必要があります。
本当に DataGrid から参照を取得する必要がある場合は、次のようにキャストしてください。
ListCollectionView myList = (ListCollectionView)dataGrid.ItemsSource;
しかし、ほとんどの場合、それを行っている場合は、コードの構造に何か問題がある可能性があります。
より大きなコレクションのセット/サブセットの操作に問題がある可能性があります。例えば:
ItemsSource = dsJournals.Local.Where(j => j.Jrnl == "AAA");
dsJournals.Local
は ですListCollectionView
が、LINQ クエリの結果はEnumerableCollectionView
です。