WPF DataGrid中double类型数据按数值排序问题求助
解决DataGrid按真实double数值排序的方案
方法1:指定SortMemberPath(最简便)
直接在你的DataGridTextColumn中添加SortMemberPath属性,指向模型里的MoneyTotal字段(实际存储double数值的字段)。这样点击表头排序时,DataGrid会基于这个数值字段排序,而非绑定的格式化字符串。
修改后的XAML代码:
<DataGridTextColumn Header="{DynamicResource moneyTotal}" Binding="{Binding StringMoneyTotal}" SortMemberPath="MoneyTotal"/>
方法2:自定义Sorting事件逻辑
如果需要更灵活的排序控制,可通过DataGrid的Sorting事件手动替换排序逻辑:
- 在XAML中为DataGrid绑定Sorting事件:
<DataGrid x:Name="invoiceDataGrid" Sorting="invoiceDataGrid_Sorting"> <!-- 其他列定义 --> <DataGridTextColumn Header="{DynamicResource moneyTotal}" Binding="{Binding StringMoneyTotal}"/> </DataGrid>
- 在后台代码中实现事件处理:
private void invoiceDataGrid_Sorting(object sender, DataGridSortingEventArgs e) { // 仅处理目标列的排序 var targetHeader = FindResource("moneyTotal").ToString(); if (e.Column.Header.ToString() != targetHeader) return; e.Handled = true; // 禁用默认排序逻辑 var collectionView = CollectionViewSource.GetDefaultView(invoiceDataGrid.ItemsSource) as ListCollectionView; if (collectionView == null) return; // 清空现有排序规则 collectionView.SortDescriptions.Clear(); // 切换排序方向 var sortDir = e.Column.SortDirection == ListSortDirection.Ascending ? ListSortDirection.Descending : ListSortDirection.Ascending; // 添加按MoneyTotal排序的规则 collectionView.SortDescriptions.Add(new SortDescription("MoneyTotal", sortDir)); // 更新表头排序箭头状态 e.Column.SortDirection = sortDir; }
方法3:通过ICollectionView预设排序
若你的数据源绑定到ICollectionView(如ListCollectionView),可直接在ViewModel层设置排序规则:
// 假设你的原始数据集合 var invoiceList = new ObservableCollection<InvoiceModel>(); // 创建集合视图 var collectionView = new ListCollectionView(invoiceList); // 添加按MoneyTotal排序的规则(默认升序) collectionView.SortDescriptions.Add(new SortDescription("MoneyTotal", ListSortDirection.Ascending)); // 将视图绑定到DataGrid invoiceDataGrid.ItemsSource = collectionView;
这种方式下,无论界面点击排序还是初始加载,都会基于真实double数值排序,同时界面仍显示格式化后的字符串。
内容的提问来源于stack exchange,提问作者Schecher_1
相关产品推荐
相关产品推荐

