Mega Code Archive

 
Categories / C# / WPF
 

Create a ListView control that uses a GridView view mode to display dates

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