Отвечая на мой вопрос здесь.
Я решил эту проблему, установив SortMemberPath в моих сгенерированных столбцах на их индекс в коллекции RowVM.Cells, и добавил свойство SortOnMe в мои RowVM.
Когда пользователь сортирует сетку данных, он добавляет SortDescription, содержащий индексный номер (взятый из SortMemberPath), в PagedCollectionView. Я наблюдаю за этим, прослушивая событие propertyaged в PagedCollectionView с помощью метода ниже. Он добавляет новую 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 и обработать сортировку там.