読者です 読者をやめる 読者になる 読者になる

Code for final

ふぁいなる向けのコード置き場です。すでにコードじゃないこともいっぱい。

DataGridでヘッダクリックのソート順を昇順→降順→なし→昇順にしたい。

DataGridのヘッダクリックのソートは便利です。(3回目)
ただ、デフォルトだとソートの切替が昇順→降順→昇順のループになって元に戻せません。
初期ソート順が、第2ソートキーまである場合とかだと、ヘッダクリックで元の表示順に戻せないのは致命的です。

通常、ヘッダクリックのソートだと昇順→降順→なし→昇順のループとなる場合が多いと思います。
今回はその昇順→降順→なし→昇順のループにする方法です。

簡単にいうとSortingイベントをハンドリングして自前で実装します。
具体的には以下のようなコードをいれるだけです。

private void DataGrid_OnSorting(object sender, DataGridSortingEventArgs e)
{
    if (e.Column.SortDirection == ListSortDirection.Descending)
    {
        // 降順の次はソートを無効にする
        e.Column.SortDirection = null;
        e.Handled = true; // イベントを処理済みにする。(デフォルトのソート機能を実行しない)
        // このままでは矢印アイコンが消えて降順になるだけなので、以下の処理をいれる。
        var view = CollectionViewSource.GetDefaultView(((DataGrid)sender).ItemsSource);
        view.SortDescriptions.Clear();
    }
}

MVVM向けに簡単に実装できるようにCommandをFinalstreamUIComponentsで提供しています。
FinalstreamUIComponents/CancelableDataGridSortingCommand.cs at master · finalstream/FinalstreamUIComponents · GitHub

デフォルトで昇順→降順→なし→昇順のループだといいんですがねー。