上篇中在设置排序标志的时候,需要不停的去刷新,这样做肯定是不行的,所以必须要找到其它的方式。
看了一下关于自定义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
最终效果: