Win11下WinUI3应用WCT DataGrid缺失SortMemberPath属性问题
WinUI CommunityToolkit DataGrid列排序问题排查与实现
问题背景
需要为项目内DataGrid控件实现列排序功能,已将控件的CanUserSortColumns属性设置为True,参考公开技术方案说明,为对应列设置SortMemberPath属性即可启用排序,但当前环境下无法找到该属性:
- 在Visual Studio属性面板输入
sort关键词检索,智能提示仅显示CanUserSort、SortDirection两个排序相关属性,无其他排序配置项 - 当前项目引用的相关NuGet包:
CommunityToolkit.WinUI.UI.ControlsCommunityToolkit.WinUI.UI.Controls.DataGrid
- MainWindow.xaml中DataGrid控件代码如下:
<controls:DataGrid Grid.Row="1" x:Name="dataGrid" Margin="12" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" AlternatingRowBackground="Transparent" AlternatingRowForeground="LightGray" AreRowDetailsFrozen="False" AreRowGroupHeadersFrozen="False" AutoGenerateColumns="True" CanUserSortColumns="True" CanUserReorderColumns="True" CanUserResizeColumns="True" ColumnHeaderHeight="32" MaxColumnWidth="400" FrozenColumnCount="0" GridLinesVisibility="None" IsReadOnly="False" RowDetailsTemplate="{StaticResource RowDetailsTemplate}" RowDetailsVisibilityMode="Collapsed" SelectionMode="Single" AutoGeneratingColumn="autogenerating" HeadersVisibility="Column"> <controls:DataGrid.Columns> <controls:DataGridTextColumn Header="wow"></controls:DataGridTextColumn> </controls:DataGrid.Columns> </controls:DataGrid>
- 属性面板检索截图:

- 核心问题:
- 是否存在不依赖
SortMemberPath属性实现DataGrid列排序的方案 - 当前环境或配置存在什么遗漏导致
SortMemberPath属性缺失
- 是否存在不依赖
问题解答
SortMemberPath属性缺失原因
属性缺失不是NuGet包引用错误,是版本差异导致的API不匹配:
- 你当前引用的是7.x及更早版本的
CommunityToolkit.WinUI.UI.Controls.DataGrid,该版本的DataGrid列类型未暴露SortMemberPath属性,VS属性面板检索不到该属性属于正常现象。 SortMemberPath是高版本DataGrid才加入的属性,目前新版WinUI Community Toolkit已经调整包名为CommunityToolkit.WinUI.Controls.DataGrid(移除了原包名中的.UI段),升级到8.0及以上版本后,即可直接在XAML和属性面板中找到并使用SortMemberPath属性。
不依赖SortMemberPath的列排序实现方案
如果暂时不计划升级NuGet包,可以通过监听DataGrid的Sorting事件手动实现排序逻辑,完全不需要依赖SortMemberPath属性,实现步骤如下:
- 在现有DataGrid的XAML声明中添加Sorting事件绑定:
<controls:DataGrid <!-- 保留原有所有属性配置 --> Sorting="DataGrid_Sorting">
- 在页面后台代码中添加事件处理逻辑,直接操作绑定的数据源完成排序:
using System.ComponentModel; using System.Linq; using System.Reflection; using Microsoft.UI.Xaml.Controls; private void DataGrid_Sorting(object sender, DataGridColumnEventArgs e) { // 获取当前点击列对应的实体属性名 string sortPropertyName = e.Column.Tag?.ToString(); // 自动生成列场景:直接从列的绑定配置中提取属性路径 if (string.IsNullOrEmpty(sortPropertyName) && e.Column is DataGridBoundColumn boundColumn) { sortPropertyName = (boundColumn.Binding as Binding)?.Path.Path; } if (string.IsNullOrWhiteSpace(sortPropertyName)) { e.Handled = true; return; } // 轮换排序方向:默认升序,重复点击切换为降序 DataGridSortDirection targetDirection; if (e.Column.SortDirection == null || e.Column.SortDirection == DataGridSortDirection.Descending) { targetDirection = DataGridSortDirection.Ascending; } else { targetDirection = DataGridSortDirection.Descending; } e.Column.SortDirection = targetDirection; // 对数据源执行排序 var rawSource = dataGrid.ItemsSource as IEnumerable<object>; if (rawSource == null) { e.Handled = true; return; } PropertyInfo sortProperty = null; IEnumerable<object> sortedSource; if (targetDirection == DataGridSortDirection.Ascending) { sortedSource = rawSource.OrderBy(item => { sortProperty ??= item.GetType().GetProperty(sortPropertyName); return sortProperty?.GetValue(item); }).ToList(); } else { sortedSource = rawSource.OrderByDescending(item => { sortProperty ??= item.GetType().GetProperty(sortPropertyName); return sortProperty?.GetValue(item); }).ToList(); } // 刷新绑定数据源 dataGrid.ItemsSource = sortedSource; e.Handled = true; }
- 列配置适配:
- 手动定义列场景:直接给对应列的
Tag属性赋值需要排序的实体属性名即可,比如示例中Header为"wow"的列如果绑定实体的WowContent字段,写法为<controls:DataGridTextColumn Header="wow" Tag="WowContent"></controls:DataGridTextColumn> - 自动生成列场景:在你已经绑定的
AutoGeneratingColumn事件回调中,给每列的Tag属性赋值当前列的绑定路径即可,不需要逐列手动配置。
- 手动定义列场景:直接给对应列的
内容的提问来源于stack exchange,提问作者Organic Search
相关产品推荐
相关产品推荐

