私は自分でこの問題に遭遇しました。私の解決策は、Sorting イベントをインターセプトし、DataGrid に依存して処理するのではなく、ViewModel で ICollectionView に並べ替えを実行させることでした。
XAML:
<DataGrid ItemsSource="{Binding StatusItemsGrouped}" Sorting="OnSorting_"/>
XAML.CS:
private void OnSorting_(object sender, DataGridSortingEventArgs e)
{
var viewModel = DataContext as ViewModel;
e.Handled = true; // prevent DataGrid from sorting
viewModel.SortItemSource(e.Column); // perform sorting
e.Column.SortDirection = viewModel.SortDirection; // set sort direction icon on column header
}
ビューモデル:
public class ViewModel
{
public ListCollectionView StatusItemsGrouped { get; set; }
public ListSortDirection SortDirection { get; set; }
public string SortColumn { get; set; }
public void SortItemSource(string columnName)
{
if (String.Compare(SortColumn, columnName, true) == 0)
SortDirection = ListSortDirection.Ascending;
else
SortDirection = ListSortDirection.Descending;
SortColumn = columnName;
using(StatusItemsGrouped.DeferRefresh()) {
StatusItemsGrouped.GroupDescriptions.Clear();
StatusItemsGrouped.SortDescriptions.Clear();
StatusItemsGrouped.SortDescriptions.Add(new SortDescription(SortColumn, SortDirection));
StatusItemsGrouped.GroupDescriptions.Add(new PropertyGroupDescription("GenericStatus"));
}
StatusItemsGrouped.Refresh();
}
}