Как применить правило пользовательской сортировки к WPF DataGrid?

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

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

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

 public class BlankLastStringComparer : IComparer { 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 решение, если это возможно.

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

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

 dataGrid.Sorting += new DataGridSortingEventHandler(SortHandler); 

реализовать метод (я делаю это в производном classе)

 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; } 

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

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

  • сортировка проблем с использованием функции-члена в качестве компаратора
  • C ++ сортировка и отслеживание индексов
  • Алгоритм параллельной сортировки
  • Обратный компаратор в Java 8
  • Сортировка списка пользовательских classов
  • Как отсортировать двумерный массив в C #?
  • Список C # Сортировать по x, тогда y
  • int array (сортировка от самого низкого до самого высокого)
  • Учитываются ли в имени столбца и таблицы имена в MySQL?
  • Сортировка списка точек с помощью Java
  • В чем разница между `sorted (list)` vs `list.sort ()`?
  • Давайте будем гением компьютера.