Как я могу применить пользовательское правило сортировки к WPF DataGrid? - PullRequest
24 голосов
/ 25 января 2010

Когда пользователь выполняет сортировку столбцов в моем DataGrid, я хочу, чтобы все пустые или пустые ячейки сортировались по низу, а не по верху.

Я написал IComparer<T>, который гарантирует, что пробелы всегда сортируются по убыванию, но я не могу понять, как применить его к столбцам моего DataGrid. Обратите внимание, что начальная сортировка DataGrid, которую я делаю с помощью метода LINQ OrderBy(), прекрасно работает. Проблема заключается в том, что все последующие сортировки, выполняемые пользователем, сортируют пробелы сверху.

Код для сравнения

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 дружественное решение, если это возможно.

Ответы [ 2 ]

27 голосов
/ 25 января 2010

вот как я это делаю: я наследую сетку, чтобы хранить все это внутри класса, поэтому я присоединяюсь к обработчикам событий внутри

прикрепить к событию сортировки

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;
}
3 голосов
/ 28 октября 2013

У меня есть решение MVVM для этой проблемы, которое использует прикрепленное поведение. Если вы предпочитаете использовать программный код, решение @ Aran тоже поможет.

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

...