private static ListSortDirection GetSortingDirection(GridViewColumnHeader headerClicked, ListViewSortItem listViewSortItem) { if (headerClicked != listViewSortItem.LastColumnHeaderClicked) { return(ListSortDirection.Ascending); } else { return((listViewSortItem.LastSortDirection == ListSortDirection.Ascending) ? ListSortDirection.Descending : ListSortDirection.Ascending); } }
public static void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e) { ListView view = sender as ListView; if (view == null) { return; } ListViewSortItem listViewSortItem = _listViewDefinitions[view.Name]; if (listViewSortItem == null) { return; } GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader; if (headerClicked == null) { return; } ListCollectionView collectionView = CollectionViewSource.GetDefaultView(view.ItemsSource) as ListCollectionView; if (collectionView == null) { return; } ListSortDirection sortDirection = GetSortingDirection(headerClicked, listViewSortItem); string header = headerClicked.Tag as string; if (string.IsNullOrEmpty(header)) { return; } if (listViewSortItem.Comparer != null) { view.Cursor = System.Windows.Input.Cursors.Wait; listViewSortItem.Comparer.SortBy = header; listViewSortItem.Comparer.SortDirection = sortDirection; listViewSortItem.Comparer.DirectionDig = ((sortDirection.Equals(ListSortDirection.Ascending)) ? -1 : 1); try { collectionView.CustomSort = listViewSortItem.Comparer; } catch { } view.Items.Refresh(); view.Cursor = System.Windows.Input.Cursors.Arrow; } else { view.Items.SortDescriptions.Clear(); view.Items.SortDescriptions.Add(new SortDescription(headerClicked.Column.Header.ToString(), sortDirection)); view.Items.Refresh(); } listViewSortItem.LastColumnHeaderClicked = headerClicked; listViewSortItem.LastSortDirection = sortDirection; if ((listViewSortItem.Adorner != null) && (listViewSortItem.LastColumnHeaderClicked != null)) { AdornerLayer.GetAdornerLayer(listViewSortItem.LastColumnHeaderClicked).Remove(listViewSortItem.Adorner); } switch (sortDirection) { case ListSortDirection.Ascending: listViewSortItem.Adorner = new SortAdorner(headerClicked, ListSortDirection.Ascending); AdornerLayer.GetAdornerLayer(headerClicked).Add(listViewSortItem.Adorner); break; case ListSortDirection.Descending: listViewSortItem.Adorner = new SortAdorner(headerClicked, ListSortDirection.Descending); AdornerLayer.GetAdornerLayer(headerClicked).Add(listViewSortItem.Adorner); break; } }