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
相关产品推荐
相关产品推荐

