ここで自分の質問に答えます。
生成された列の SortMemberPath を RowVM.Cells コレクションのインデックス番号に設定することでこれを解決し、RowVM に SortOnMe プロパティを追加しました。
ユーザーがデータグリッドを並べ替えると、インデックス番号 (SortMemberPath から取得) を含む SortDescription が PagedCollectionView に追加されます。以下のメソッドで PagedCollectionView の propertychanged イベントをリッスンすることで、これを監視します。PagedCollectionView に "SortOnMe" で並べ替えるように指示する新しい SortDescription を追加し、問題のセルから並べ替えるデータを 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 を作成し、そこで並べ替えを処理することです。