<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="ListViewSort.Window1" xmlns:s="clr-namespace:System.Collections;assembly=mscorlib" xmlns:p="clr-namespace:System;assembly=mscorlib"> <Window.Resources> <DataTemplate x:Key="HeaderTemplateArrowUp"> <DockPanel> <TextBlock HorizontalAlignment="Center" Text="{Binding}"/> <Path x:Name="arrow" StrokeThickness = "1" Fill = "gray" Data = "M 5,10 L 15,10 L 10,5 L 5,10"/> </DockPanel> </DataTemplate> <DataTemplate x:Key="HeaderTemplateArrowDown"> <DockPanel> <TextBlock HorizontalAlignment="Center" Text="{Binding }"/> <Path x:Name="arrow" StrokeThickness = "1" Fill = "gray" Data = "M 5,5 L 10,10 L 15,5 L 5,5"/> </DockPanel> </DataTemplate> </Window.Resources> <StackPanel> <ListView x:Name='lv' Height="150" GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler"> <ListView.View> <GridView> <GridViewColumn DisplayMemberBinding="{Binding Path=Year}" Header="Year" Width="100"/> </GridView> </ListView.View> <ListView.ItemsSource> <s:ArrayList> <p:DateTime>2003/1/1 12:22:02</p:DateTime> <p:DateTime>2003/1/2 13:2:01</p:DateTime> <p:DateTime>2007/1/3 2:1:6</p:DateTime> <p:DateTime>2007/1/4 13:6:55</p:DateTime> <p:DateTime>2009/2/1 12:22:02</p:DateTime> <p:DateTime>2008/2/2 13:2:01</p:DateTime> <p:DateTime>2000/2/3 2:1:6</p:DateTime> <p:DateTime>2002/2/4 13:6:55</p:DateTime> <p:DateTime>2001/3/1 12:22:02</p:DateTime> <p:DateTime>2006/3/2 13:2:01</p:DateTime> <p:DateTime>2004/3/3 2:1:6</p:DateTime> <p:DateTime>2004/3/4 13:6:55</p:DateTime> </s:ArrayList> </ListView.ItemsSource> </ListView> </StackPanel> </Window> //File:Window.xaml.cs using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Collections; using System.Windows.Controls.Primitives; using System.ComponentModel; using System.Windows.Data; namespace ListViewSort { public partial class Window1 : Window { public Window1() { InitializeComponent(); } GridViewColumnHeader _lastHeaderClicked = null; ListSortDirection _lastDirection = ListSortDirection.Ascending; void GridViewColumnHeaderClickedHandler(object sender,RoutedEventArgs e) { GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader; ListSortDirection direction; if (headerClicked == null){ return; } if (headerClicked.Role != GridViewColumnHeaderRole.Padding){ return; } if (headerClicked != _lastHeaderClicked){ direction = ListSortDirection.Ascending; }else{ if (_lastDirection == ListSortDirection.Ascending){ direction = ListSortDirection.Descending; }else{ direction = ListSortDirection.Ascending; } } string header = headerClicked.Column.Header as string; Sort(header, direction); if (direction == ListSortDirection.Ascending) { headerClicked.Column.HeaderTemplate = Resources["HeaderTemplateArrowUp"] as DataTemplate; }else{ headerClicked.Column.HeaderTemplate = Resources["HeaderTemplateArrowDown"] as DataTemplate; } if (_lastHeaderClicked != null && _lastHeaderClicked != headerClicked) { _lastHeaderClicked.Column.HeaderTemplate = null; } _lastHeaderClicked = headerClicked; _lastDirection = direction; } private void Sort(string sortBy, ListSortDirection direction) { ICollectionView dataView = CollectionViewSource.GetDefaultView(lv.ItemsSource); dataView.SortDescriptions.Clear(); SortDescription sd = new SortDescription(sortBy, direction); dataView.SortDescriptions.Add(sd); dataView.Refresh(); } } }