WPF MVVM中如何对DataGrid排序且保留最后一行在末尾?
解决DataGrid排序时保留最后一行在末尾的方法
核心思路
手动拦截排序事件,将数据源拆分为「需排序的主体数据」和「固定在末尾的行」两部分,仅对主体数据执行排序,最后将固定行追加到排序结果末尾,再重新绑定数据源。
具体实现(以WPF为例)
private void DataGrid_Sorting(object sender, DataGridSortingEventArgs e) { // 取消默认排序逻辑,改用自定义处理 e.Handled = true; var dataGrid = sender as DataGrid; if (dataGrid == null || dataGrid.ItemsSource == null) return; // 转换数据源为可操作的集合(替换YourDataModel为实际数据实体类型) var originalItems = dataGrid.ItemsSource.Cast<YourDataModel>().ToList(); if (originalItems.Count <= 1) return; // 拆分数据:主体行 + 固定末尾行 var fixedLastItem = originalItems.Last(); var itemsToSort = originalItems.Take(originalItems.Count - 1).ToList(); // 获取当前排序的列和方向 var sortDir = e.Column.SortDirection ?? ListSortDirection.Ascending; var sortProperty = string.IsNullOrEmpty(e.Column.SortMemberPath) ? e.Column.Header.ToString() : e.Column.SortMemberPath; // 对主体行执行排序 itemsToSort = sortDir == ListSortDirection.Ascending ? itemsToSort.OrderBy(item => GetPropValue(item, sortProperty)).ToList() : itemsToSort.OrderByDescending(item => GetPropValue(item, sortProperty)).ToList(); // 合并数据并重新绑定 itemsToSort.Add(fixedLastItem); dataGrid.ItemsSource = itemsToSort; // 更新列头的排序方向指示器 e.Column.SortDirection = sortDir == ListSortDirection.Ascending ? ListSortDirection.Descending : ListSortDirection.Ascending; } // 辅助方法:反射获取对象属性值 private object GetPropValue(object obj, string propName) { return obj.GetType().GetProperty(propName)?.GetValue(obj, null); }
优化建议(更鲁棒的拆分方式)
如果固定行有专属标识(比如某个属性IsFooter为true),可以通过标识筛选而非索引取最后一行,避免数据源变动导致的错误:
// 假设固定行的IsFooter属性为true var itemsToSort = originalItems.Where(item => !item.IsFooter).ToList(); var fixedLastItem = originalItems.First(item => item.IsFooter);
内容的提问来源于stack exchange,提问作者SureshKSrinivasan
相关产品推荐
相关产品推荐

