Gewusst wie: Sortieren einer GridView-Spalte beim Klicken auf einen Header

Aktualisiert: November 2007

In diesem Beispiel wird veranschaulicht, wie ein ListView-Steuerelement erstellt wird, in dem ein GridView-Ansichtsmodus implementiert ist und der Dateninhalt beim Klicken auf einen Spaltenheader sortiert wird.

Beispiel

Im folgenden Beispiel wird ein GridView mit drei Spalten definiert, die an die Eigenschaften Year, Month und Day der DateTime-Struktur gebunden sind.

<GridView>
  <GridViewColumn DisplayMemberBinding="{Binding Path=Year}" 
                  Header="Year"
                  Width="100"/>
  <GridViewColumn DisplayMemberBinding="{Binding Path=Month}" 
                  Header="Month"
                  Width="100"/>
  <GridViewColumn DisplayMemberBinding="{Binding Path=Day}" 
                  Header="Day"
                  Width="100"/>
</GridView>

Im folgenden Beispiel werden die Datenelemente dargestellt, die als ArrayList von DateTime-Objekten definiert sind. Die ArrayList wird als ItemsSource für das ListView-Steuerelement festgelegt.

<ListView.ItemsSource>
  <s:ArrayList>
    <p:DateTime>1993/1/1 12:22:02</p:DateTime>
    <p:DateTime>1993/1/2 13:2:01</p:DateTime>
    <p:DateTime>1997/1/3 2:1:6</p:DateTime>
    <p:DateTime>1997/1/4 13:6:55</p:DateTime>
    <p:DateTime>1999/2/1 12:22:02</p:DateTime>
    <p:DateTime>1998/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>

Die Bezeichner s und p in den XAML-Tags beziehen sich auf die Namespace-Zuordnungen, die in den Metadaten der Seite XAML festgelegt werden. Im folgenden Beispiel wird die Metadatendefinition veranschaulicht.

<Window      
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://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">

Um die Daten nach dem Spalteninhalt zu sortieren, wird im Beispiel ein Ereignishandler festgelegt, von dem das durch Klicken auf die Spaltenheader-Schaltfläche ausgelöste Click-Ereignis verarbeitet wird. Das folgende Beispiel zeigt, wie ein Ereignishandler für das GridViewColumnHeader-Steuerelement festgelegt wird.

<ListView x:Name='lv' Height="150" HorizontalAlignment="Center" 
  VerticalAlignment="Center" 
  GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler"
 >

Im Beispiel wird der Ereignishandler festgelegt, durch den bei jedem Klicken auf die Spaltenheader-Schaltfläche die Sortierrichtung in auf- bzw. absteigend geändert wird. Im folgenden Beispiel wird der Ereignishandler dargestellt.

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)
        {
            if (headerClicked.Role != GridViewColumnHeaderRole.Padding)
            {
                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;
                }

                // Remove arrow from previously sorted header
                if (_lastHeaderClicked != null && _lastHeaderClicked != headerClicked)
                {
                    _lastHeaderClicked.Column.HeaderTemplate = null;
                }


                _lastHeaderClicked = headerClicked;
                _lastDirection = direction;
            }
        }
    }

Im folgenden Beispiel wird der Sortieralgorithmus dargestellt, der vom Ereignishandler zum Sortieren der Daten aufgerufen wird. Die Sortierung wird durch Erstellen einer neuen SortDescription-Struktur ausgeführt.

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

Das vollständige Beispiel finden Sie unter Beispiel für ein ListView zum Sortieren von Daten.

Siehe auch

Aufgaben

Beispiel für ein ListView zum Sortieren von Daten

Konzepte

Übersicht über ListView

Übersicht über GridView

Referenz

ListView

GridView

Weitere Ressourcen

Gewusst-wie-Themen zu ListView

ListView-Beispiele