遇到的问题:
一、DataGrid 默认点击列标题,是对已取到的数据排序。
二、如果给 DataGrid 重新指定数据源(如:我点击搜索按钮或者操作底部的翻页),列标题“保证时间”上的排序箭头就会消失。
解决方法:
先理解下两个属性
Column.SortDirection,可以简单理解成列标题的排序箭头(向上或向下)
Column.SortMemberPath,可以简单理解成这个列所绑定的某个字段名
然后看源码
public partial class Window1 : Window
string _columnHeader = ""; //用来记住已点击列标题的 Column.Header
ListSortDirection? _columnListSortDirection = null; //用来记住已点击列标题的 Column.SortDirection
string _columnSortMemberPath = ""; //用来记住已点击列标题的 Column.SortMemberPath
public Window1()
InitializeComponent();
dataGrid1.Sorting += DataGrid1_Sorting;
button1.Click += Button1_Click;
//这里最好设置下默认的排序列
dataGrid1.Columns[0].SortDirection = ListSortDirection.Descending;
//列标题点击事件处理器
private void DataGrid1_Sorting(object sender, DataGridSortingEventArgs e)
DataGridColumn cl = e.Column;
//这一段处理都是为了记住“被点击的列标题”
_columnHeader = cl.Header.ToString();
if (cl.SortDirection == null)
//默认情况下:未点击的列标题的 SortDirection=null,Sorting() 事件之后才设置为 SortDirection = ListSortDirection.Ascending
//这里让它在排序前,就把排序按钮设置为升序
_columnListSortDirection = ListSortDirection.Ascending;
//切换升序倒序箭头
_columnListSortDirection = cl.SortDirection == ListSortDirection.Ascending ? ListSortDirection.Descending : ListSortDirection.Ascending;
_columnSortMemberPath = cl.SortMemberPath;
BindGrid();//重新绑定数据源
e.Handled = true;//表示事件已处理,不需要默认的排序处理
//搜索按钮点击事件处理器
private void Button1_Click(object sender, RoutedEventArgs e)
BindGrid();
//数据库取数据,然后绑定到 DataGrid
private void BindGrid()
string sortStr = getSortStr();
int total = 0;
dataGrid1.ItemsSource = getData(sortStr, 1, 50, ref total);
//DataGrid 重新指定数据源之后,之前点击的列标题的排序按钮不见了怎么办,加上这个
foreach (var cl in dataGrid1.Columns)
if (cl.Header == _columnHeader)
cl.SortDirection = _columnListSortDirection;
//用当前点击的列标题组装 order by 语句
private string getSortStr()
string sortDirection = _columnListSortDirection == ListSortDirection.Ascending ? "asc" : "desc";
return $"order by {_columnSortMemberPath} {sortDirection}";//结果示例:"order by id desc"
//数据库取数据(伪代码)
private List<int> getData(string orderBy, int pageIndex, int pageSize, ref int total)
var list = new List<int>();
for (int i = 0; i < 100; i++)
list.Add(i);
return list;
二、如果给 DataGrid 重新指定数据源(如:我点击搜索按钮或者操作底部的翻页),列标题“保证时间”上的排序箭头就会消失。Column.SortDirection,可以简单理解成列标题的排序箭头(向上或向下)Column.SortMemberPath,可以简单理解成某一列绑定的数据库字段。一、DataGrid 默认的点击列标题排序,是对当前数据排序。
出人意料的是,从代码中更改某些WPF DataGrid数据后遇到许多挑战,这些代码要求对行进行新的排序并滚动DataGrid以显示最初选择的行。本文重点介绍遇到的问题以及如何解决。最后是完整的示例代码。
我正在使用WPF编写一个W
最近的项目用到了DataGrid控件,做个笔记,记录一下开发过程中遇到的问题:
1.DataGrid的ItemSource的绑定最好使用ObservableCollection<>集合类型,能够自动更新数据到前台。
2.DataGrid自带键盘导航上下左右键切换选中单元格或行的功能。但是,如果绑定了SelectedIndex(selectedItem等)属性,并且Mode=Twow...
最近用WPF的DataGrid的时候,发现一个很弱智的问题,DataGrid的ItemsSource是绑定了一个属性:
然后取数给这个集合赋值的时候,第一次赋值,就会出现列移位
起初还以为是显卡的问题,结果今天来集成显卡的电脑上也一样出现,具体原因不详,以下是几种解决办法:
1.(首选,有效果)DataGrid的RowHeaderWidth="0",必须赋...
在WPF中,DataGrid分组后,列标题未自动适应内容的问题可能是由于样式或模板未正确设置导致的。你可以尝试以下两种方法解决问题:
1. 设置DataGrid.ColumnHeaderStyle的Width属性为“Auto”
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="Width" Value="Auto"/>
</Style>
</DataGrid.ColumnHeaderStyle>
2. 自定义DataGrid的模板,将列标题部分的Width属性设置为“*”
<DataGrid>
<DataGrid.Template>
<ControlTemplate TargetType="{x:Type DataGrid}">
<Border>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<DataGridColumnHeadersPresenter Grid.Row="0"/>
<ScrollViewer Grid.Row="1"/>
</Grid>
</Border>
</ControlTemplate>
</DataGrid.Template>
</DataGrid>
以上两种方法都可以解决DataGrid分组后,列标题未自动适应内容的问题。你可以根据自己的需要选择合适的方法进行修改。