创建CustomControl的步骤我就不再累述,不清楚的请参考综合应用WPF/WCF/WF/LINQ之三:采用用代码创建的方式实现CheckListBox的CustomControl
。
为了方便大家学习,请单击此处下载该程序的代码。
这次Themes\SortableListView.xaml的内容为:
1 <ResourceDictionary
2 xmlns=" [url]http://schemas.microsoft.com/winfx/2006/xaml/presentation[/url]"
3 xmlns:x=" [url]http://schemas.microsoft.com/winfx/2006/xaml[/url]"
4 xmlns:local="clr-namespace:Eallies.OA.UI.Controls.Common">
5
6 <DataTemplate x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:SortableListView}, ResourceId=ColumnHeaderSortedAscendingTemplate}">
7 <DockPanel>
8 <TextBlock HorizontalAlignment="Center" Text="{Binding}" />
9 <Path StrokeThickness="1" Fill="Gray" Data="M 5,10 L 15,10 L 10,5 L 5,10" />
10 </DockPanel>
11 </DataTemplate>
12
13 <DataTemplate x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type local:SortableListView}, ResourceId=ColumnHeaderSortedDescendingTemplate}">
14 <DockPanel>
15 <TextBlock HorizontalAlignment="Center" Text="{Binding}" />
16 <Path StrokeThickness="1" Fill="Gray" Data="M 5,5 L 10,10 L 15,5 L 5,5" />
17 </DockPanel>
18 </DataTemplate>
19
20 </ResourceDictionary>
这里,我们定义了两个DataTemplate,分别用于实现向上排序和向下排序的方向箭头。注意:这里的难点在于Key的命名,如果您采用常规的x:Key="ColumnHeaderSortedAscendingTemplate"的方式命名,您将不能在代码中找到该资源。
之后,我们就可以很方便的用下面的方式找到该资源:
1 ComponentResourceKey ascending = new ComponentResourceKey(typeof(SortableListView), "ColumnHeaderSortedAscendingTemplate");
2 if (direction == ListSortDirection.Ascending) column.HeaderTemplate = this.TryFindResource(ascending) as DataTemplate;
解决这个难点后,具体的排序代码就比较简单了,请大家参考源代码,网上也有大把的例子可以参考。
现在让我们来看看页面中关于该控件的使用:
1 <common:SortableListView Name="headLinesGridView" ItemsSource="{Binding}">
2 <ListView.View>
3 <GridView>
4 <common:SortableGridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}" SortPropertyName="ID" Width="50" />
5 <common:SortableGridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" />
6 <common:SortableGridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}" SortPropertyName="LastName" />
7 <common:SortableGridViewColumn Header="Date of Birth" DisplayMemberBinding="{Binding DateOfBirth}" SortPropertyName="DateOfBirth" IsDefaultSortColumn="True" />
8 </GridView>
9 </ListView.View>
10 </common:SortableListView>
可以看出,上面的XAML代码中没有引用任何有关排序的DataTemplate代码,但它却已经具备了排序的功能了。这样是不是让人感觉排序功能是“与生俱来”的呢?