WPF中单击标题行可排序的GridView

2010年7月14日 分类: WPF

在实际应用中为了更好的提高用户的交互效率,我们经常在表格中实现这样的功能,如:单击表头标题,实现按这一列自动排序的功能,在WPF中如何实现这一功能呢?我们知道在WPF中显示GridView要使用ListView,那么,我们可以通过继承ListView实现单击表头自动排序的功能。看下面代码

cs代码:

public class SortableListView : ListView
{
    //最后单击的标题
    private GridViewColumnHeader _lastHeaderClicked = null;
    //默认升序
    private ListSortDirection _lastDirection = ListSortDirection.Ascending;

    //排序字段的附加属性
    public static readonly DependencyProperty SortPropertyNameProperty = DependencyProperty.RegisterAttached("SortPropertyName", typeof(string), typeof(SortableListView));
    // 附加属性的Get方法
    public static string GetSortPropertyName(GridViewColumn obj)
    {
        return (string)obj.GetValue(SortPropertyNameProperty);
    }
    //附加属性的Set方法
    public static void SetSortPropertyName(GridViewColumn obj, string value)
    {
        obj.SetValue(SortPropertyNameProperty, value);
    }

    public SortableListView()
    {
        //注册单击标题事件
        this.AddHandler(
            GridViewColumnHeader.ClickEvent,
            new RoutedEventHandler(GridViewColumnHeaderClickedHandler));
    }

    /// <summary>
    /// 排序方法
    /// </summary>
    /// <param name="sortBy">排序字段</param>
    /// <param name="direction">升序/降序</param>
    private void Sort(string sortBy, ListSortDirection direction)
    {
        ICollectionView dataView =
            CollectionViewSource.GetDefaultView(this.ItemsSource);

        if (dataView != null)
        {
            dataView.SortDescriptions.Clear();
            SortDescription sd = new SortDescription(sortBy, direction);
            dataView.SortDescriptions.Add(sd);
            dataView.Refresh();
        }
    }

    //单击标题调用的方法
    private void GridViewColumnHeaderClickedHandler(object sender, RoutedEventArgs e)
    {
        GridViewColumnHeader headerClicked = e.OriginalSource as GridViewColumnHeader;
        ListSortDirection direction;

        if (headerClicked != null &&
            headerClicked.Role != GridViewColumnHeaderRole.Padding)
        {
            if (headerClicked != _lastHeaderClicked)
            {
                direction = ListSortDirection.Ascending;
            }
            else
            {
                if (_lastDirection == ListSortDirection.Ascending)
                {
                    direction = ListSortDirection.Descending;
                }
                else
                {
                    direction = ListSortDirection.Ascending;
                }
            }
            //获得排序字段
            string sortBy = SortableListView.GetSortPropertyName(headerClicked.Column);
            if (string.IsNullOrEmpty(sortBy))
            {
                sortBy = headerClicked.Column.Header as string;
            }
            //排序操作
            this.Sort(sortBy, direction);

            _lastHeaderClicked = headerClicked;
            _lastDirection = direction;
        }
    }
}

xaml代码:

<local:SortableListView x:Name="lstView">
    <local:SortableListView.View>
        <GridView>
            <GridViewColumn Width="50" Header="ID" DisplayMemberBinding="{Binding ID}" local:SortableListView.SortPropertyName="ID"/>
            <GridViewColumn Width="100" Header="姓名" DisplayMemberBinding="{Binding Name}" local:SortableListView.SortPropertyName="Name"/>
            <GridViewColumn Width="50" Header="年龄" DisplayMemberBinding="{Binding Age}" local:SortableListView.SortPropertyName="Age"/>
            <GridViewColumn Width="200" Header="生日" DisplayMemberBinding="{Binding Birthday}" local:SortableListView.SortPropertyName="Birthday"/>
        </GridView>
    </local:SortableListView.View>
</local:SortableListView>

我们给ListView添加一个附加属性,定义排序的字段名称,通过构造函数注册单击标题的事件,当单击标题时,激发该事件时,进行排序操作。在xaml文件中,我们只要指定排序字段即SortableListView.SortPropertyName属性即可。

代码下载

原创文章,转载请注明: 转载自.NET开发者

本文链接地址: WPF中单击标题行可排序的GridView

 

Related posts:

  1. WPF中RichTextBox设置字体样式的方法
  2. WPF中的Converter
  3. WPF无边框透明窗体的缩放
  4. WPF中的拖放(三)
  5. MVVM(Model-View-ViewModel)实例讲解
标签: , , ,

1条评论 于 “WPF中单击标题行可排序的GridView”

  1. 2010年9月11日13:51
    1

    im feeling it

Leave a Comment