You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:37:34