上篇中在设置排序标志的时候,需要不停的去刷新,这样做肯定是不行的,所以必须要找到其它的方式。

看了一下关于自定义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         }

完整的代码如下:

Code

 

最终效果:

posted on 2008-12-26 11:11  *小小黄*  阅读(1396)  评论(3编辑  收藏  举报