看了下有关自定义ColumnHeader内容在2.0测试版本中可以直接设置Column.Header为某个自定义Control控件但是在正式版中这个功能被取消了必须要通过Column.HeaderStyle来设置动态设置Style还是比较费事暂时还没有做好
所以想了个折中办法就是在Header上面手工加上"↑"和"↓"来标示排序方向
所要做就是在MouseDown中修改下Header.Content
代码如下:
1privatevoiddgData_MouseLeftButtonDown(objectsender,MouseButtonEventArgse)
2 {
3 varu=fromelementinVisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null),dgData)
4 whereelementisDataGridColumnHeader
5 selectelement;
6
7 (u.Count1)
8 {
9 //鼠标点击ColumnHeader
10 DataGridColumnHeaderheader=(DataGridColumnHeader)u.Single;
11 //要排序字段
12 _sort=header.Content.;
13 //清除名称中↑和↓
14 _sort=removeSortStateFlag(_sort);
15 //判断排序方向
16 (_sortsortFiled)
17 dir=dir"desc"?"asc":"desc";
18
19 {
20 //如果新排序字段和当前排序字段不样则要清楚当前排序字段排序标志(↑↓)
21 (sortHeader!=null)
22 sortHeader.Content=removeSortStateFlag(sortHeader.Content.);
23 dir="asc";
24 }
25 sortFiled=_sort;
26 //加上排序标志
27 header.Content=dir"asc"?_sort+"↑":_sort+"↓";
28 //设置新排序字段为当前排序字段
29 sortHeader=header;
30 BindGrid;
31 e.Handled=true;
32 }
33
34 e.Handled=false;
35 }
完整代码如下:
1 publicpartialProductsList:UserControl
2 {
3 privateList<Products>products_list;
4 privatePagerpager=null;
5 //当前排序字段
6 privatesortFiled="ProductID";
7 //当前排序方向
8 privatedir="asc";
9 //当前排序ColumnHeader
10 privateDataGridColumnHeadersortHeader;
11
12 publicProductsList
13 {
14 InitializeComponent;
15 MouseHelper.SetMouseWheelHandler(OnMouseWheel);
16 BindGrid;
17 }
18
19 privatevoidBindGrid
20 {
21 canvas.Visibility=Visibility.Visible;
22 varclient=NorthWindWCF.NorthWindWCFClient;
23 client.GetProductsPagingCompletedEventHandler<GetProductsPagingCompletedEventArgs>(client_GetProductsPagingCompleted);
24 start=1;
25 limit=10;
26 (pager!=null)
27 start=(pager.PageIndex-1)*10+1;
28 client.GetProductsPagingAsync(start,limit,sortFiled,dir);
29 }
30
31 publicvoidOnMouseWheel(objectsender,MouseWheelHandlerEventArgsargs)
32 {
33 (Parentnull);
34 sv.ScrollToVerticalOff(sv.VerticalOff-args.Delta*15);
35 }
36
37 privatevoidclient_GetProductsPagingCompleted(objectsender,GetProductsPagingCompletedEventArgse)
38 {
39 (e.Errornull)
40 {
41 products_list=e.Result.ToList;
42 dgData.ItemsSource=products_list;
43 (pagernull)
44 {
45 pager=Pager(e.TotalPage,2);
46 pager.ClickPager.PagerButtonClick(pager_Click);
47 pager.PageIndex=1;
48 spPager.Children.Clear;
49 spPager.Children.Add(pager);
50 }
51 }
52
53 MessageBox.Show(e.Error.Message);
54 canvas.Visibility=Visibility.Collapsed;
55 }
56
57 privatevoidpager_Click(objectsender,RoutedEventArgse)
58 {
59 BindGrid;
60 }
61
62 privatevoiddgData_MouseLeftButtonDown(objectsender,MouseButtonEventArgse)
63 {
64 varu=fromelementinVisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null),dgData)
65 whereelementisDataGridColumnHeader
66 selectelement;
67
68 (u.Count1)
69 {
70 //鼠标点击ColumnHeader
71 DataGridColumnHeaderheader=(DataGridColumnHeader)u.Single;
72 //要排序字段
73 _sort=header.Content.;
74 //清除名称中↑和↓
75 _sort=removeSortStateFlag(_sort);
76 //判断排序方向
77 (_sortsortFiled)
78 dir=dir"desc"?"asc":"desc";
79
80 {
81 //如果新排序字段和当前排序字段不样则要清楚当前排序字段排序标志(↑↓)
82 (sortHeader!=null)
83 sortHeader.Content=removeSortStateFlag(sortHeader.Content.);
84 dir="asc";
85 }
86 sortFiled=_sort;
87 //加上排序标志
88 header.Content=dir"asc"?_sort+"↑":_sort+"↓";
89 //设置新排序字段为当前排序字段
90 sortHeader=header;
91 BindGrid;
92 e.Handled=true;
93 }
94
95 e.Handled=false;
96 }
97
98 privateremoveSortStateFlag(dir)
99 {
100 pos=dir.IndexOfAny(char{'↑','↓'});
101 (pos>0)dir=dir.Sub(0,pos-1);
102 dir;
103 }
104
最终效果:
最新评论