0

我有一个 silverlight 数据网格,它绑定到一个显示 RowViewModel 集合的 PagedCollectionView。

每个 RowVM 都有一个 CellViewModel 集合,datagrid 列是模板列,动态生成,其内容绑定到 Cell[0].Content、Cell[1].Content 等。这是因为 rowviewmodels 是从服务返回的,并且可以包含任意数量的列和不同类型的内容。

这工作得很好,但我在数据网格中启用列排序时遇到了问题。DataGridColumns 上的 SortMemberPath 属性(最终成为 SortDescription.PropertyName)似乎不适用于包含索引的表达式,例如“Cells[1].Content”。

有谁知道解决这个问题的方法?

4

2 回答 2

0

您可以基于 CellViewModels 的集合生成动态对象

看到这个

Silverlight 应用程序的轻量级数据表

最好的祝福。

布鲁诺·罗查

于 2010-07-09T09:07:57.040 回答
0

在这里回答我自己的问题。

我通过将生成的列上的 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 并在那里处理排序。

于 2010-07-12T10:26:39.160 回答