-
ListView控制项:

ListView排序

在上一章中,我们了解了如何通过访问ListView的View实例然后添加组描述来对WPF ListView中的项进行分组。将排序应用于ListView同样容易,并且大部分过程完全相同。让我们尝试一个简单的例子,我们按年龄对用户对象进行排序:

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

XAML看起来就像前面的例子,我们只是有几列用于显示有关用户的信息 - 这里没什么新东西。

在后台代码中,我们再次创建一个User对象列表,然后我们将其指定为ListView的ItemsSource。 完成后,我们使用ItemsSource属性来获取ListView自动为我们创建的CollectionView实例,我们可以使用它来操纵ListView如何显示对象。

使用view对象,我们向它添加一个新的SortDescription,指定我们希望我们的列表按Age属性按升序排序。 从截图中可以看出,这非常有效 - 列表按年龄排序,而不是添加项的顺序。

多个排序条件

如第一个例子所示,排序非常简单,但在屏幕截图中你会看到Sammy排在Donna之前。它们具有相同的年龄,因此在这种情况下,WPF将仅使用它们的添加顺序。幸运的是,WPF允许我们根据需要指定尽可能多的排序条件。在上面的示例中,尝试将与视图相关的代码更改为以下内容:

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

现在,视图将先使用年龄进行排序,当年龄相同时,使用名称排序。

小结

如上例所示,对ListView的内容进行排序非常容易,但到目前为止,所有排序都是由程序员而不是最终用户决定的。在下一篇文章中,我将为您提供一篇how-to文章,向您展示如何让用户通过单击列来确定排序,如Windows中所示。