WPF中单击标题行可排序的GridView
在实际应用中为了更好的提高用户的交互效率,我们经常在表格中实现这样的功能,如:单击表头标题,实现按这一列自动排序的功能,在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:
im feeling it