在这里回答我自己的问题。
我通过将生成的列上的 SortMemberPath 设置为它们在 RowVM.Cells 集合中的索引号解决了这个问题,并向我的 RowVM 添加了一个 SortOnMe 属性。
当用户对数据网格进行排序时,它会将包含索引号(取自 SortMemberPath)的 SortDescription 添加到 PagedCollectionView。我通过以下方法监听 PagedCollectionView 上的 propertychanged 事件来监控这一点。它添加了一个新的 SortDescription,告诉 PagedCollectionView 在“SortOnMe”上排序,并将数据从有问题的单元格复制到 row.SortOnMe。
private bool _currentlySorting;
private void PagedCollectionView_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
var pcv = (PagedCollectionView)sender;
int columnIndex = 0;
if (!_currentlySorting && e.PropertyName == "SortDescriptions" && pcv.SortDescriptions.Count == 1 && int.TryParse(pcv.SortDescriptions[0].PropertyName, out columnIndex)) {
_currentlySorting = true;
pcv.SortDescriptions.Add(new SortDescription("SortOnMe", pcv.SortDescriptions(0).Direction));
foreach (RowViewModel row in pcv.SourceCollection) {
row.SortOnMe = row.Cells(columnIndex).Content;
}
_currentlySorting = false;
}
}
老实说,这是一个非常丑陋的解决方案。但它有效,我现在花了太多时间把头撞在墙上。
由于 PagedCollectionView 是一个密封类(为什么?!),我能想到的唯一另一种方法是创建我自己的 PagedCollectionView 并在那里处理排序。