Сортировка PagedCollectionView по индексу (с использованием сетки данных Silverlight) - PullRequest
0 голосов
/ 09 июля 2010

У меня есть сетка данных silverlight, которая связана с PagedCollectionView, отображающим коллекцию RowViewModels.

Каждая RowVM имеет коллекцию CellViewModels, а столбцы сетки данных являются столбцами шаблонов и генерируются динамически, а их содержимое привязано к Cell [0] .Content, Cell [1] .Content и т. Д. Это происходит потому, что rowviewmodelsвозвращаются из службы и могут содержать любое количество столбцов и различные типы содержимого.

Это работает просто отлично, но у меня возникли проблемы при включении сортировки столбцов в сетке данных.Кажется, что свойство SortMemberPath в DataGridColumns (которое в конце концов становится SortDescription.PropertyName) не будет работать с выражением, содержащим индекс, например, «Cells [1] .Content».

Кто-нибудь знает способвокруг этого?

Ответы [ 2 ]

0 голосов
/ 12 июля 2010

Отвечая на мой вопрос здесь.

Я решил эту проблему, установив 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 и обработать сортировку там.

0 голосов
/ 09 июля 2010

Вы можете создать динамический объект, основанный на коллекции CellViewModels

См.

Облегченная таблица данных для ваших приложений Silverlight

С уважением.

Бруно Роша

...