上篇中在设置排序标志的时候,需要不停的去刷新,这样做肯定是不行的,所以必须要找到其它的方式。
看了一下关于自定义ColumnHeader的内容,在2.0的测试版本中,可以直接设置Column.Header为某个自定义的控件,但是在正式版中,这个功能被取消了,必须要通过Column.HeaderStyle来设置,动态设置Style还是比较费事的,暂时还没有做好。
所以想了个折中的办法,就是在Header上面手工加上"↑"和"↓"来标示排序的方向。
所要做的就是在MouseDown中修改一下Header.Content
代码如下:
1
private
void
dgData_MouseLeftButtonDown(
object
sender, MouseButtonEventArgs e)
2 {
3 var u = from element in VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition( null ), dgData)
4 where element is DataGridColumnHeader
5 select element;
6
7 if (u.Count() == 1 )
8 {
9 // 鼠标点击的ColumnHeader
10 DataGridColumnHeader header = (DataGridColumnHeader)u.Single();
11 // 要排序的字段
12 string _newsort = header.Content.ToString();
13 // 清除名称中的↑和↓
14 _newsort = removeSortStateFlag(_newsort);
15 // 判断排序方向
16 if (_newsort == sortFiled)
17 dir = dir == " desc " ? " asc " : " desc " ;
18 else
19 {
20 // 如果新的排序字段和当前的排序字段不一样,则要清楚当前排序字段的排序标志(↑↓)
21 if (sortHeader != null )
22 sortHeader.Content = removeSortStateFlag(sortHeader.Content.ToString());
23 dir = " asc " ;
24 }
25 sortFiled = _newsort;
26 // 加上排序标志
27 header.Content = dir == " asc " ? _newsort + " ↑ " : _newsort + " ↓ " ;
28 // 设置新的排序字段为当前排序字段
29 sortHeader = header;
30 BindGrid();
31 e.Handled = true ;
32 }
33 else
34 e.Handled = false ;
35 }
2 {
3 var u = from element in VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition( null ), dgData)
4 where element is DataGridColumnHeader
5 select element;
6
7 if (u.Count() == 1 )
8 {
9 // 鼠标点击的ColumnHeader
10 DataGridColumnHeader header = (DataGridColumnHeader)u.Single();
11 // 要排序的字段
12 string _newsort = header.Content.ToString();
13 // 清除名称中的↑和↓
14 _newsort = removeSortStateFlag(_newsort);
15 // 判断排序方向
16 if (_newsort == sortFiled)
17 dir = dir == " desc " ? " asc " : " desc " ;
18 else
19 {
20 // 如果新的排序字段和当前的排序字段不一样,则要清楚当前排序字段的排序标志(↑↓)
21 if (sortHeader != null )
22 sortHeader.Content = removeSortStateFlag(sortHeader.Content.ToString());
23 dir = " asc " ;
24 }
25 sortFiled = _newsort;
26 // 加上排序标志
27 header.Content = dir == " asc " ? _newsort + " ↑ " : _newsort + " ↓ " ;
28 // 设置新的排序字段为当前排序字段
29 sortHeader = header;
30 BindGrid();
31 e.Handled = true ;
32 }
33 else
34 e.Handled = false ;
35 }
完整的代码如下:
Code
1 public partial class ProductsList : UserControl
2 {
3 private List<Products> products_list;
4 private Pager pager = null;
5 //当前排序的字段
6 private string sortFiled = "ProductID";
7 //当前排序的方向
8 private string dir = "asc";
9 //当前排序的ColumnHeader
10 private DataGridColumnHeader sortHeader;
11
12 public ProductsList()
13 {
14 InitializeComponent();
15 MouseHelper.SetMouseWheelHandler(OnMouseWheel);
16 BindGrid();
17 }
18
19 private void BindGrid()
20 {
21 canvas.Visibility = Visibility.Visible;
22 var client = new NorthWindWCF.NorthWindWCFClient();
23 client.GetProductsPagingCompleted += new EventHandler<GetProductsPagingCompletedEventArgs>(client_GetProductsPagingCompleted);
24 int start = 1;
25 int limit = 10;
26 if (pager != null)
27 start = (pager.PageIndex - 1) * 10 + 1;
28 client.GetProductsPagingAsync(start, limit, sortFiled, dir);
29 }
30
31 public void OnMouseWheel(object sender, MouseWheelHandlerEventArgs args)
32 {
33 if (Parent == null) return;
34 sv.ScrollToVerticalOffset(sv.VerticalOffset - args.Delta * 15);
35 }
36
37 private void client_GetProductsPagingCompleted(object sender, GetProductsPagingCompletedEventArgs e)
38 {
39 if (e.Error == null)
40 {
41 products_list = e.Result.ToList();
42 dgData.ItemsSource = products_list;
43 if (pager == null)
44 {
45 pager = new Pager(e.TotalPage, 2);
46 pager.Click += new Pager.PagerButtonClick(pager_Click);
47 pager.PageIndex = 1;
48 spPager.Children.Clear();
49 spPager.Children.Add(pager);
50 }
51 }
52 else
53 MessageBox.Show(e.Error.Message);
54 canvas.Visibility = Visibility.Collapsed;
55 }
56
57 private void pager_Click(object sender, RoutedEventArgs e)
58 {
59 BindGrid();
60 }
61
62 private void dgData_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
63 {
64 var u = from element in VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), dgData)
65 where element is DataGridColumnHeader
66 select element;
67
68 if (u.Count() == 1)
69 {
70 //鼠标点击的ColumnHeader
71 DataGridColumnHeader header = (DataGridColumnHeader)u.Single();
72 //要排序的字段
73 string _newsort = header.Content.ToString();
74 //清除名称中的↑和↓
75 _newsort = removeSortStateFlag(_newsort);
76 //判断排序方向
77 if (_newsort == sortFiled)
78 dir = dir == "desc" ? "asc" : "desc";
79 else
80 {
81 //如果新的排序字段和当前的排序字段不一样,则要清楚当前排序字段的排序标志(↑↓)
82 if (sortHeader != null )
83 sortHeader.Content = removeSortStateFlag(sortHeader.Content.ToString());
84 dir = "asc";
85 }
86 sortFiled = _newsort;
87 //加上排序标志
88 header.Content = dir == "asc" ? _newsort + " ↑" : _newsort + " ↓";
89 //设置新的排序字段为当前排序字段
90 sortHeader = header;
91 BindGrid();
92 e.Handled = true;
93 }
94 else
95 e.Handled = false;
96 }
97
98 private string removeSortStateFlag(string dir)
99 {
100 int pos = dir.IndexOfAny(new char[] { '↑', '↓' });
101 if (pos > 0) dir = dir.Substring(0, pos - 1);
102 return dir;
103 }
104
1 public partial class ProductsList : UserControl
2 {
3 private List<Products> products_list;
4 private Pager pager = null;
5 //当前排序的字段
6 private string sortFiled = "ProductID";
7 //当前排序的方向
8 private string dir = "asc";
9 //当前排序的ColumnHeader
10 private DataGridColumnHeader sortHeader;
11
12 public ProductsList()
13 {
14 InitializeComponent();
15 MouseHelper.SetMouseWheelHandler(OnMouseWheel);
16 BindGrid();
17 }
18
19 private void BindGrid()
20 {
21 canvas.Visibility = Visibility.Visible;
22 var client = new NorthWindWCF.NorthWindWCFClient();
23 client.GetProductsPagingCompleted += new EventHandler<GetProductsPagingCompletedEventArgs>(client_GetProductsPagingCompleted);
24 int start = 1;
25 int limit = 10;
26 if (pager != null)
27 start = (pager.PageIndex - 1) * 10 + 1;
28 client.GetProductsPagingAsync(start, limit, sortFiled, dir);
29 }
30
31 public void OnMouseWheel(object sender, MouseWheelHandlerEventArgs args)
32 {
33 if (Parent == null) return;
34 sv.ScrollToVerticalOffset(sv.VerticalOffset - args.Delta * 15);
35 }
36
37 private void client_GetProductsPagingCompleted(object sender, GetProductsPagingCompletedEventArgs e)
38 {
39 if (e.Error == null)
40 {
41 products_list = e.Result.ToList();
42 dgData.ItemsSource = products_list;
43 if (pager == null)
44 {
45 pager = new Pager(e.TotalPage, 2);
46 pager.Click += new Pager.PagerButtonClick(pager_Click);
47 pager.PageIndex = 1;
48 spPager.Children.Clear();
49 spPager.Children.Add(pager);
50 }
51 }
52 else
53 MessageBox.Show(e.Error.Message);
54 canvas.Visibility = Visibility.Collapsed;
55 }
56
57 private void pager_Click(object sender, RoutedEventArgs e)
58 {
59 BindGrid();
60 }
61
62 private void dgData_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
63 {
64 var u = from element in VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), dgData)
65 where element is DataGridColumnHeader
66 select element;
67
68 if (u.Count() == 1)
69 {
70 //鼠标点击的ColumnHeader
71 DataGridColumnHeader header = (DataGridColumnHeader)u.Single();
72 //要排序的字段
73 string _newsort = header.Content.ToString();
74 //清除名称中的↑和↓
75 _newsort = removeSortStateFlag(_newsort);
76 //判断排序方向
77 if (_newsort == sortFiled)
78 dir = dir == "desc" ? "asc" : "desc";
79 else
80 {
81 //如果新的排序字段和当前的排序字段不一样,则要清楚当前排序字段的排序标志(↑↓)
82 if (sortHeader != null )
83 sortHeader.Content = removeSortStateFlag(sortHeader.Content.ToString());
84 dir = "asc";
85 }
86 sortFiled = _newsort;
87 //加上排序标志
88 header.Content = dir == "asc" ? _newsort + " ↑" : _newsort + " ↓";
89 //设置新的排序字段为当前排序字段
90 sortHeader = header;
91 BindGrid();
92 e.Handled = true;
93 }
94 else
95 e.Handled = false;
96 }
97
98 private string removeSortStateFlag(string dir)
99 {
100 int pos = dir.IndexOfAny(new char[] { '↑', '↓' });
101 if (pos > 0) dir = dir.Substring(0, pos - 1);
102 return dir;
103 }
104
最终效果: