Condividi tramite


Procedura: ordinare una colonna GridView quando si fa clic su un'intestazione

Aggiornamento: novembre 2007

In questo esempio viene illustrato come creare un controllo ListView con cui implementare una modalità di visualizzazione GridView e ordinare il contenuto quando si fa clic su un'intestazione di colonna.

Esempio

Nell'esempio riportato di seguito viene definito un oggetto GridView con tre colonne associate alle proprietà Year, Month e Day della struttura DateTime.

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

Nell'esempio riportato di seguito vengono illustrati gli elementi di dati definiti come oggetto ArrayList degli oggetti DateTime. L'oggetto ArrayList è definito come proprietà ItemsSource per il controllo ListView.

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

Gli identificatori s e p nei tag XAML fanno riferimento a mapping dello spazio dei nomi definiti nei metadati della pagina XAML. Nell'esempio riportato di seguito viene illustrata la definizione dei metadati.

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

Per ordinare i dati in base al contenuto di una colonna, nell'esempio viene definito un gestore eventi per la gestione dell'evento Click che si verifica quando si preme il pulsante dell'intestazione di colonna. Nell'esempio riportato di seguito viene illustrato come specificare un gestore eventi per il controllo GridViewColumnHeader.

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

Nell'esempio viene definito il gestore eventi in modo che la direzione di ordinamento passi da crescente a decrescente e viceversa ogni volta che si preme il pulsante dell'intestazione di colonna. Nell'esempio riportato di seguito viene illustrato il gestore eventi.

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

Nell'esempio riportato di seguito viene illustrato l'algoritmo di ordinamento chiamato dal gestore eventi per ordinare i dati. L'ordinamento viene eseguito creando una nuova struttura SortDescription.

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

Per l'esempio completo, vedere Esempio di ListView con ordinamento dei dati.

Vedere anche

Attività

Esempio di ListView con ordinamento dei dati

Concetti

Panoramica sul controllo ListView

Cenni preliminari su GridView

Riferimenti

ListView

GridView

Altre risorse

Procedure relative al controllo ListView

Esempi di ListView