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

WPF如何获取DataGrid用户输入数据并实现按字母顺序排序

WPF DataGrid获取用户输入并实现姓名字母排序方案

核心逻辑:WPF DataGrid采用数据驱动设计,所有用户输入会自动同步到绑定的数据源,不需要手动遍历UI单元格取值,直接操作绑定的集合即可完成排序。


具体实现步骤

  • 第一步:定义支持属性变更通知的实体类
    用户在单元格编辑的内容要自动同步到数据源,实体类必须实现INotifyPropertyChanged接口:

    using System.ComponentModel;
    using System.Runtime.CompilerServices;
    
    public class Person : INotifyPropertyChanged
    {
        private string _firstName;
        private string _lastName;
    
        public string FirstName
        {
            get => _firstName;
            set
            {
                _firstName = value;
                OnPropertyChanged();
            }
        }
    
        public string LastName
        {
            get => _lastName;
            set
            {
                _lastName = value;
                OnPropertyChanged();
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    
  • 第二步:使用可观察集合作为DataGrid绑定源
    用ObservableCollection<Person>存储所有姓名数据,新增行、数据变更都会自动通知UI刷新,不要用普通List做数据源。
    窗口后台代码示例:

    using System.Collections.ObjectModel;
    using System.Linq;
    using System.Windows;
    
    public partial class MainWindow : Window
    {
        private readonly ObservableCollection<Person> _personList = new ObservableCollection<Person>();
    
        public MainWindow()
        {
            InitializeComponent();
            // 集合绑定到DataGrid
            NameDataGrid.ItemsSource = _personList;
        }
    
        // 新增行按钮点击逻辑
        private void AddNewRowBtn_Click(object sender, RoutedEventArgs e)
        {
            _personList.Add(new Person());
        }
    }
    

    对应XAML的DataGrid列定义参考,绑定配置要设置输入后即时同步:

    <DataGrid x:Name="NameDataGrid" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="First Name" 
                                Binding="{Binding FirstName, UpdateSourceTrigger=LostFocus}"/>
            <DataGridTextColumn Header="Last Name" 
                                Binding="{Binding LastName, UpdateSourceTrigger=LostFocus}"/>
        </DataGrid.Columns>
    </DataGrid>
    

    配置完成后,用户在DataGrid单元格输入的所有内容,会在焦点离开单元格时自动写入_personList集合对应的Person对象,完全不需要手动读取UI控件值。

  • 第三步:实现排序按钮逻辑
    直接对绑定的_personList集合做排序,重排后UI会自动刷新:

    private void SortNameBtn_Click(object sender, RoutedEventArgs e)
    {
        // 忽略大小写按字母排序,优先按Last Name排序,同Last Name再按First Name排序
        var sortedResult = _personList
            .OrderBy(p => p.LastName, StringComparer.OrdinalIgnoreCase)
            .ThenBy(p => p.FirstName, StringComparer.OrdinalIgnoreCase)
            .ToList();
    
        // 按排序结果重新填充集合
        _personList.Clear();
        foreach (var item in sortedResult)
        {
            _personList.Add(item);
        }
    }
    

注意事项

  • 不要通过遍历VisualTree找DataGridRow、DataGridCell读取输入值,这种方式违背WPF设计原则,容易出空引用、数据不同步问题,后续维护成本极高
  • 如果需要按中文拼音排序,把排序用的StringComparer替换为对应区域比较器即可:StringComparer.Create(new CultureInfo("zh-CN"), true)
  • 如果开启了DataGrid自带的CanUserAddRows="True"新增行功能,用户手动新增的行也会自动加入绑定的_personList集合,排序逻辑不需要额外调整

内容的提问来源于stack exchange,提问作者Hulises

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 21:15:37