Как применить правило пользовательской сортировки к 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

  • Таблица сортировки неверна при нажатии кнопки сортировки более одного раза?
  • Почему quicksort более популярен, чем сортировка radix?
  • Получение информации о последовательном порту
  • Angularjs неправильный $ index после orderBy
  • Список C # Сортировать по x, тогда y
  • Как отсортировать список объектов по некоторому свойству
  • Пользовательский вид mysql
  • Сортировка поля varchar численно в MySQL
  • Как выполнить qsort массив указателей на char в C?
  • Какой алгоритм сортировки лучше всего работает в основном отсортированных данных?
  • Сортировка одной строки в Java
  • Interesting Posts

    Как запланировать запрос MySQL?

    Есть ли способ запустить страницу JSF без создания всего проекта?

    Notepad ++ не запускается (notepad ++. Exe присутствует в диспетчере задач)

    Исправлена ​​ошибка «Параметр недействителен» System.Drawing.Image

    Как поврежден мой SSD-диск

    Каковы приложения бинарных деревьев?

    Преобразование магнитного поля X, Y, Z значений из устройства в глобальную систему отсчета

    Как получить индекс X и Y элемента внутри GridLayout?

    Клавиатура фокусируется на первом файле в проводнике Windows?

    Может ли JAXB быть маршалом сдерживанием сначала, а затем маршалом by @XmlIDREF для последующих ссылок?

    Проект MVC по ошибке VS2010: тип проекта не поддерживается этой установкой

    Как отключить эффекты MouseOver для кнопки в WPF?

    Способ перемещения курсора по аргументам в bash?

    Как связать кнопку WPF с командой в ViewModelBase?

    Установка значения свойства Singleton в Firebase Listener

    Давайте будем гением компьютера.