web-dev-qa-db-ja.com

カスタム並べ替え規則をWPF DataGridに適用するにはどうすればよいですか?

ユーザーがDataGridで列の並べ替えを行う場合、すべてのnullまたは空のセルを上ではなく下に並べ替えます。

私は空白が常に下にソートされることを確認する_IComparer<T>_を書きましたが、それをDataGridの列に適用する方法がわかりません。 LINQ OrderBy()メソッドで実行しているDataGridinitialソートが機能することに注意してくださいすごい。問題は、ユーザーが実行するすべての後続の並べ替えで、空白が一番上に並べ替えられることです。

比較コード

_public class BlankLastStringComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        if (string.IsNullOrEmpty(x) && !string.IsNullOrEmpty(y))
            return 1;
        else if (!string.IsNullOrEmpty(x) && string.IsNullOrEmpty(y))
            return -1;
        else
            return string.Compare(x, y);
    }
}
_

質問

DataGridColumnでコンパレータを使用するにはどうすればよいですか?または、これが不可能な場合は、回避策を提供できますか?できれば、MVVMフレンドリーなソリューションを期待しています。

26
devuxer

これは私がそれを行う方法です:私はこれをすべてクラス内に保つためにグリッドから派生するので、内部でイベントハンドラーにアタッチします

並べ替えイベントに添付する

dataGrid.Sorting += new DataGridSortingEventHandler(SortHandler);

メソッドを実装します(派生クラスでこれを行います)

void SortHandler(object sender, DataGridSortingEventArgs e)
{
    DataGridColumn column = e.Column;

    IComparer comparer = null;

    //i do some custom checking based on column to get the right comparer
    //i have different comparers for different columns. I also handle the sort direction
    //in my comparer

    // prevent the built-in sort from sorting
    e.Handled = true;

    ListSortDirection direction = (column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending;

    //set the sort order on the column
    column.SortDirection = direction;

    //use a ListCollectionView to do the sort.
    ListCollectionView lcv = (ListCollectionView)CollectionViewSource.GetDefaultView(this.ItemsSource);

    //this is my custom sorter it just derives from IComparer and has a few properties
    //you could just apply the comparer but i needed to do a few extra bits and pieces
    comparer = new ResultSort(direction);

    //apply the sort
    lcv.CustomSort = comparer;
}
28
Aran Mulholland

アタッチされた動作を利用するこの問題のMVVMソリューションがあります。コードビハインドを使用したい場合は、@ Aranのソリューションも有効です。

https://stackoverflow.com/a/18218963/2115261

4
trilson86