在上一章中,我们了解了如何通过访问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中所示。