一、实现排序成果
需求是这样的:假如我们把学生的分数放入ListView,当我们单机ListView头部时候实现对按分数的排序,变动Xaml如下:
<Window x:Class="ContentDataTemplate.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:c="clr-namespace:System.Collections;assembly=mscorlib" xmlns:local="clr-namespace:ContentDataTemplate" Title="MainWindow"> <Window.Resources> <c:ArrayList x:Key="stuList"> <local:Student Grade="研一" Professional="计算机技术" Score="30" HasJob="true"></local:Student> <local:Student Grade="大一" Professional="网络工程" Score="80" HasJob="true"></local:Student> <local:Student Grade="研一" Professional="软件工程" Score="100" HasJob="False"></local:Student> <local:Student Grade="研一" Professional="自动化控制" Score="70" HasJob="true"></local:Student> <local:Student Grade="研一" Professional="软件设计" Score="60" HasJob="False"></local:Student> </c:ArrayList> <DataTemplate x:Key="NameDt"> <TextBox x:Name="textboxName" Text="{Binding Name}" GotFocus="textboxName_GotFocus"></TextBox> </DataTemplate> <DataTemplate x:Key="GradeDt"> <TextBox x:Name="textboxGrade" Text="{Binding Grade}"></TextBox> </DataTemplate> <DataTemplate x:Key="ProfessionalDt"> <TextBox x:Name="textboxProfessional" Text="{Binding Professional}"></TextBox> </DataTemplate> <DataTemplate x:Key="ScoreDt"> <TextBox Text="{Binding Score}"></TextBox> </DataTemplate> <DataTemplate x:Key="HasJobDt"> <CheckBox x:Name="CheckBocHasJob" IsChecked="{Binding HasJob}" Checked="CheckBocHasJob_Checked"></CheckBox> </DataTemplate> </Window.Resources> <Grid Margin="5"> <ListView x:Name="ListViewStudent" ItemsSource="{StaticResource stuList}"> <ListView.View> <GridView> <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Id}"></GridViewColumn> <GridViewColumn Header="姓名" CellTemplate="{StaticResource NameDt}"></GridViewColumn> <GridViewColumn Header="年级" CellTemplate="{StaticResource GradeDt}"></GridViewColumn> <GridViewColumn Header="专业" CellTemplate="{StaticResource ProfessionalDt}"></GridViewColumn> <GridViewColumn Header="分数" CellTemplate="{StaticResource ScoreDt}"></GridViewColumn> <GridViewColumn Header="已事情" CellTemplate="{StaticResource HasJobDt}"></GridViewColumn> </GridView> </ListView.View> </ListView> </Grid> </Window>
变动处所也不久不多,Student类添加Score属性,DataTemplate中增加Score的列模板,数据源添加一些默认的分数。
数据有了,下面就是排序成果了,首先写一个排序的函数:StuSort(string sortBy, ListSortDirection direction);排序成果的实现是通过CollectionViewSource类实现的,这个类我就不介绍了,可以对数据源进行排序分组什么的,详情参考MSDN 。代码如下:
private void StuSort(ListView lv, 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();//刷新视图 }
函数写好了,介绍下此函数的三个参数,第一个毫无疑问是数据的承载着ListView了,第二个对照重要是要通过阿谁字段排序,本例子是通过Student的Score来排序,所以就是“Score”,第三个参数是排序标的目的,升序或者降序了。然后当我们点击ListView的Header的时候触发此函数。Xaml页面中的ListView中监控GridViewColumnHeaderClick的路由事件,
<ListView x:Name="ListViewStudent"
ItemsSource="{StaticResource stuList}"
GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler"
>
后台实现GridViewColumnHeaderClickedHandler事件,代码如下: