WPF DataGrid列求和咨询:无法通过Rows属性访问行
WPF DataGrid列求和的解决方案
嘿,我来帮你搞定这个WPF DataGrid列求和的问题!你遇到的DataGrid.Rows无法使用的情况很正常——因为WPF的DataGrid和WinForms的不一样,它没有Rows属性,而是用Items集合来管理数据项。下面给你两种靠谱的实现方式,其中更推荐的是从数据源直接计算的方法,既简洁又可靠。
方法一:直接从数据源计算(推荐)
既然你的DataGrid是通过数据绑定展示tutar字段的,那最好直接从绑定的数据源集合中求和,完全不需要依赖UI元素,避免了格式转换错误或者UI元素为空的问题。
假设你的数据源是一个类似这样的集合(比如ObservableCollection):
// 定义你的数据模型 public class LabItem { public decimal tutar { get; set; } // 其他属性... } // 在你的用户控件/ViewModel中定义数据源 private ObservableCollection<LabItem> _labItems; public ObservableCollection<LabItem> LabItems { get => _labItems; set { _labItems = value; // 如果实现了INotifyPropertyChanged,这里触发通知 OnPropertyChanged(nameof(LabItems)); } } // 绑定DataGrid的ItemsSource grid_lab.ItemsSource = LabItems;
那求和只需要一行LINQ代码就能搞定:
decimal sum = LabItems.Sum(item => item.tutar);
这种方式的好处是:
- 代码简洁,可读性强
- 不依赖UI结构,就算你调整了列的顺序或者修改了UI样式,求和逻辑不受影响
- 避免了字符串转decimal的潜在错误(比如格式不匹配、空值等)
方法二:通过UI元素获取值(适合无法直接访问数据源的场景)
如果因为某些原因你必须从DataGrid的UI元素中取值,那可以优化你原来的代码,解决潜在的问题:
原来代码的问题
- 依赖列索引
7,如果后续调整列的顺序,代码会出错 - 直接用
decimal.Parse没有处理空值或格式错误的情况,容易抛出异常 Items.Count - 1是多余的——因为你已经设置了CanUserAddRows="False",不会有新增的空行
优化后的代码
decimal sum = 0m; // 遍历所有数据项 foreach (var item in grid_lab.Items) { // 找到表头为"Tutar"的列(避免依赖索引) var tutarColumn = grid_lab.Columns.FirstOrDefault(c => c.Header.ToString() == "Tutar"); if (tutarColumn == null) continue; // 获取单元格的TextBlock var textBlock = tutarColumn.GetCellContent(item) as TextBlock; // 安全转换,避免空引用和格式错误 if (textBlock != null && decimal.TryParse(textBlock.Text, out decimal value)) { sum += value; } }
关键提醒
- 尽量使用方法一,这符合WPF的数据绑定思想(数据和UI分离),代码更健壮
- 确保你的数据模型中
tutar属性是decimal类型,而不是字符串——这样不仅能避免转换错误,还能让数据处理更规范
内容的提问来源于stack exchange,提问作者user8210624




