创建CustomControl的步骤我就不再累述,不清楚的请参考综合应用WPF/WCF/WF/LINQ之三:采用用代码创建的方式实现CheckListBox的CustomControl

  为了方便大家学习,请单击此处下载该程序的代码。
  这次Themes\SortableListView.xaml的内容为:
    1
    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    
    7        
    8            
    9            
   10        
   11    
   12
   13    
   14        
   15            
   16            
   17        
   18    
   19
   20
  这里,我们定义了两个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    
    2        
    3            
    4                
    5                
    6                
    7                
    8            
    9        
   10    
  可以看出,上面的XAML代码中没有引用任何有关排序的DataTemplate代码,但它却已经具备了排序的功能了。这样是不是让人感觉排序功能是“与生俱来”的呢?