Я столкнулся с похожей проблемой сортировки WPF Listview / Gridview, и у меня есть некоторые недостатки, которые затрудняют реализацию предоставленных решений CSharp. По сути, у меня есть существующее приложение ASP.NET с тысячами строк отлаженного VB-кода, а также рабочий SQL для базы данных с более чем 100 таблицами и некоторыми очень сложными объединениями. Мне нужно написать Windows .exe на основе того же приложения, но я хочу использовать WPF для реализации аналогичного графического интерфейса.
Закончив с заявлением об отказе, я столкнулся с проблемой сортировки, поискал в Интернете все отличные общие концепции, подобные приведенным выше, и попытался преобразовать их из CS в VB. Я опытный программист, но я обнаружил, что это просто за пределами моей досягаемости, поэтому я стал другим, и вместо этого разработал свой собственный вид. Это, вероятно, ужаснет пуристов, но я прагматик, и создание коммерческого приложения имеет преимущество.
Чтобы отсортировать сетку, я решил просто использовать события Mouse в заголовках столбцов. DoubleClick для сортировки по возрастанию и MouseRightButtonUp для убывания.
<GridViewColumn Header="Project Name   " Width="300" >
Private Sub ListViewGrid_MouseDoubleClick(
ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles ListingDG.MouseDoubleClick
Try
Dim mouseHdrClick As String = DirectCast(DirectCast(e.OriginalSource, System.Object), System.Windows.Controls.TextBlock).Text
Dim SqlOrderBy As String = ""
Select Case UCase(mouseHdrClick.Trim)
Case UCase("Product Name")
SqlOrderBy = " ORDER BY Product_Name"
Затем я просто перезагружаю ListViewGrid, используя строковую переменную SqlOrderBy. Единственная проблема, с которой я столкнулся, заключалась в том, что мне пришлось нажать на текст заголовка в заголовке столбца, чтобы он работал. Я решил это, просто добавив символ пробела XML ( 
), чтобы заполнить ширину столбца. Команда .Trim
снова очищает их для работы Select Case. Я до сих пор не понял, как добавить маленькие стрелки вверх и вниз, но здесь важна функциональность, поскольку сейчас это всего лишь косметические штрихи.
<GridViewColumn Header="Project Name   " Width="300">
В заключение позвольте мне добавить, что я полностью осознаю, что если я изменю структуру Gridview, это приведет к перемещению текста заголовка в другое место в OriginalSource, но это проблема, с которой я могу сейчас жить. Я знаю, что это быстрый и грязный обходной путь, и, возможно, есть гораздо лучшие альтернативы, поэтому любые рекомендации будут оценены.