TOC

This article is currently in the process of being translated into Czech (~97% done).

Ovládací prvek ListView:

Třídění položek v ListView

V předchozí kapitole jsme viděli, jak ve WPF instanci ListView seskupit položky a přidat popis dané skupiny. Použit třídění v ListView je stejně snadné a také i většina procesů je zde přesně stejná. Zkusme si jednoduchý příklad, kdy seřadíme objekty uživatele podle jejich věku:

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

Kód v XAML vypadá stejně jako v předchozím příkladu, kde máme prostě pár sloupců zobrazující informace o uživateli – tedy nic nového.

V code-behind znovu vytvoříme seznam objektů Uživatele, který pak přiřadíme jako ItemsSource prvku ListView. Jakmile jsme to udělali, použijeme vlastnost ItemsSource k získání instance CollectionView, kterou pro nás ListView automaticky vytvoří a kterou můžeme použít k manipulaci toho, jak ListView zobrazí naše objekty.

Když máme k dispozici objekt zobrazení, přidáme k němu nový SortDescription a tím prvku sdělíme, že chceme, aby byl náš seznam seřazen podle vlastnosti Age ve vzestupném pořadí. Jak můžete vidět ze snímku obrazovky, funguje to perfektně - seznam je seřazen podle věku, místo toho, aby položky byly zobrazeny v pořadí, v jakém byly přidány.

Více násobná třídící kritéria

Jak je znázorněno v prvním příkladu, třídění je velmi snadné, ale na snímku obrazovky uvidíte, že Sammy je zařazena před Donnou. Mají stejný věk, takže v tomto případě WPF použije pouze pořadí, ve kterém byly přidány. Naštěstí, WPF nám umožňuje zadat tolik kritérií řazení, kolik chceme. Ve výše uvedeném příkladu zkuste změnit kód související se zobrazením na něco takového:

CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(lvUsers.ItemsSource);
view.SortDescriptions.Add(new SortDescription("Age", ListSortDirection.Ascending));
view.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));

Nyní bude zobrazení seřazeno jako první podle stáří, a když jsou nalezeny dvě identické hodnoty, název bude použit jako sekundární parametr řazení.

Shrnutí

Jak je vidět ve výše uvedených příkladech, třídit obsah ListView je velmi snadné, ale zatím je o třídění rozhodováno programátorem, a ne koncovým uživatelem. V dalším článku vám ukáži, jak umožnit uživateli třídění položek kliknutím na příslušný sloupec, jak je zvyklý ze systému Windows.

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!