2010-07-09 2 views
0

У меня есть dllagrid silverlight, который привязан к PagedCollectionView, отображающему коллекцию RowViewModels.Сортировка PagedCollectionView по индексу (с использованием Silverlight Datagrid)

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

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

Кто-нибудь знает об этом?

ответ

0

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

Я решил это, установив SortMemberPath на мои сгенерированные столбцы на их индексный номер в коллекции RowVM.Cells и добавил свойство SortOnMe в мои RowVM.

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

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

Смотреть это

Lightweight DataTable for your Silverlight applications

С наилучшими пожеланиями.

Bruno Rocha

+0

Привет! Спасибо за ответ, но я не уверен, как это относится к моей проблеме при сортировке набора инструментов Silverlight tooltit datagrid? – Zissou

Смежные вопросы