This article is currently in the process of being translated into Portuguese (~99% done).
ListView sorting
No último capítulo, vimos como poderíamos agrupar itens no ListView do WPF acessando a instância View do ListView e, em seguida, adicionando uma descrição do grupo. Aplicar a classificação a um ListView é igualmente fácil e a maior parte do processo é exatamente a mesma. Vamos tentar um exemplo simples em que classificamos os objetos do usuário por idade:
<Window x:Class="WpfTutorialSamples.ListView_control.ListViewSortingSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ListViewSortingSample" Height="200" Width="300">
<Grid Margin="10">
<ListView Name="lvUsers">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
</GridView>
</ListView.View>
</ListView>
</Grid>
</Window>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;
namespace WpfTutorialSamples.ListView_control
{
public partial class ListViewSortingSample : Window
{
public ListViewSortingSample()
{
InitializeComponent();
List<User> items = new List<User>();
items.Add(new User() { Name = "John Doe", Age = 42 });
items.Add(new User() { Name = "Jane Doe", Age = 39 });
items.Add(new User() { Name = "Sammy Doe", Age = 13 });
items.Add(new User() { Name = "Donna Doe", Age = 13 });
lvUsers.ItemsSource = items;
CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lvUsers.ItemsSource);
view.SortDescriptions.Add(new SortDescription("Age", ListSortDirection.Ascending));
}
}
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}
}
O XAML se parece com um exemplo anterior, em que simplesmente temos algumas colunas para exibir informações sobre o usuário - nada de novo aqui.
No Code-behind, mais uma vez criamos uma lista de objetos User, que então designamos como ItemsSource do ListView. Uma vez feito isso, usamos a propriedade ItemsSource para obter a instância do CollectionView que o ListView cria automaticamente para nós e que podemos usar para manipular como o ListView mostra nossos objetos.
Com o objeto view em nossa mão, adicionamos um novo SortDescription a ele, especificando que queremos que nossa lista seja classificada pela propriedade Age, em ordem crescente. Como você pode ver na captura de tela, isso funciona perfeitamente bem - a lista é classificada por idade, em vez de estar na mesma ordem em que os itens foram adicionados.
Vários critérios de classificação
Como mostrado no primeiro exemplo, a classificação é muito fácil, mas na tela você verá que Sammy vem antes de Donna. Eles têm a mesma idade, portanto, neste caso, o WPF apenas usará a ordem em que foram adicionados. Felizmente, o WPF nos permite especificar quantos critérios de classificação desejarmos. No exemplo acima, tente alterar o código relacionado à visualização para algo como isto:
CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lvUsers.ItemsSource);
view.SortDescriptions.Add(new SortDescription("Age", ListSortDirection.Ascending));
view.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
Agora, a visualização será classificada usando a idade primeiro e, quando dois valores idênticos forem encontrados, o nome será usado como um parâmetro de classificação secundário.
Resumo
É muito fácil classificar o conteúdo de um ListView, como visto nos exemplos acima, mas até agora, toda a classificação é decidida pelo programador e não pelo usuário final. No próximo artigo, darei um artigo explicativo sobre como permitir que o usuário decida a classificação clicando nas colunas, conforme visto no Windows.