ListView Sorting

This sample shows how to create a ListView control that uses a GridView to display a list of dates that are defined as DateTime objects. The sample enables sorting of data in ascending or descending order according to the contents of one column.

Key Step 1. Add Sorting method in GridViewColumnHeader.Click event. Consider both last clicked header and last sorting direction, and decide current sorting direction. Sorting itself is very simple, as written in Sort method.

 

ListView x:Name='lv' GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler">

 

GridViewColumnHeader _lastHeaderClicked = null;

        ListSortDirection _lastDirection = ListSortDirection.Ascending;

        void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e)

        {

            GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader;

            ListSortDirection direction;

            if (headerClicked != null)

            {

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

 

  _lastHeaderClicked = headerClicked;

                _lastDirection = direction;

 

            }

           

        }

 

        private void Sort(string sortBy, ListSortDirection direction)

        {

            lv.Items.SortDescriptions.Clear();

            SortDescription sd = new SortDescription(sortBy, direction);

            lv.Items.SortDescriptions.Add(sd);

            lv.Items.Refresh();

        }

Key Step 2(optional). In order to figure out current sorting status, add Template in the Column Header. Change Template along with sorting status, so it should also be added in GridViewColumnHeader.Click event. And in the Template, Use path to draw the arrows.

  <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>

 

  void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e)

        {

           

            if (headerClicked != null)

            {

                if (_lastHeaderClicked != null)

                {

                    _lastHeaderClicked.Column.HeaderTemplate = null;

                }

           

                if (direction == ListSortDirection.Ascending)

                {

                    headerClicked.Column.HeaderTemplate =

                      Resources["HeaderTemplateArrowUp"] as DataTemplate;

                }

                else

                {

                    headerClicked.Column.HeaderTemplate =

                      Resources["HeaderTemplateArrowDown"] as DataTemplate;

                }

               

            }

        }

 

Key Step 3. Put it all together and you have the following ListView sorting!

This sample is based on the February CTP.

 

Declaimer: This posting is provided "AS IS" with no warranties, and confers no rights.

ListViewSorting.zip