установить начальный порядок сортировки в Silverlight DataGrid?

Когда я впервые загружаю данные в элемент управления Silverlight DataGrid, как мне сделать так, чтобы экран выглядел так, как если бы пользователь только что щелкнул заголовок первого столбца? Другими словами, данные должны быть отсортированы в порядке возрастания в соответствии со значениями этого столбца, И маленькая стрелка сортировки должна отображаться в заголовке первого столбца.

Предполагая, что это возможно, могу ли я сделать так, как если бы пользователь щелкнул первый столбец, а затем, удерживая Shift, щелкнул второй? Другими словами, могу ли я программно применить сортировку по двум частям и сделать так, чтобы экран выглядел так, как если бы это сделал пользователь?


person Eric    schedule 22.10.2008    source источник


Ответы (5)


Мне тоже нужно было сделать это, и я внимательно и внимательно посмотрел, сможет ли DataGrid это сделать.

Фактически существует соответствующий метод в классе DataGridColumnHeader, а именно InvokeProcessSort, но он внутренний и нигде больше в классах DataGrid не используется.

Все, что мне удалось сделать, это предварительно отсортировать данные непосредственно перед их привязкой. Я использую специальный сбор данных, который реализует ICollectionView, а также ObservableCollection ‹>, и это работает нормально, но не оптимально, и объем работы не обязательно необходим.

Кроме того, предоставление предварительно отсортированной коллекции означает, что в сетке не отображается маркер сортировки.

Я подниму это как проблему в системе отслеживания ошибок DataGrid - это довольно серьезное упущение, которое было бы довольно легко исправить - MS просто нужно предоставить соответствующие методы в классах DataGridColumn и DataGrid.

person Rammesses    schedule 23.01.2009

Это было моим решением:

if (pcv.CanSort == true)
{
      pcv.SortDescriptions.Add(new SortDescription("ProductionStatus", ListSortDirection.Ascending));
      pcv.SortDescriptions.Add(new SortDescription("Date", ListSortDirection.Descending));
}

, где pcv - это PageCollectionView. Сначала выполняется сортировка по свойству ProductionStatus, а затем по свойству Date. Однако небольшая стрелка сортировки отображается только для второго столбца.

person Valentin    schedule 13.12.2010
comment
Я думаю, это было удалено из Silverlight 4 - person Brandon Boone; 16.05.2011
comment
Спасибо. У меня работал и с SL4. - person Edward; 30.06.2011

Нашел хорошую небольшую статью Пола Шерифа, которая решила эту проблему за нас ...

http://weblogs.asp.net/psheriff/archive/2010/07/14/use-collectionviewsource-in-silverlight.aspx

По сути, мы все равно привязывали DataGrid к CollectionViewSource. Оказывается, у него есть набор настроек CollectionViewSource.SortDescriptions, который позволяет нам указать порядок сортировки по умолчанию.

Спасибо, Пол!

person Matt Quinn    schedule 28.09.2011

Просто добавьте SortDescriptor в DomainDataSource:

<riaControls:DomainDataSource.SortDescriptors>
    <riaControls:SortDescriptor PropertyPath="ColumnName" Direction="Descending" />
</riaControls:DomainDataSource.SortDescriptors>
person Jonathan Collins    schedule 21.01.2013

В Silverlight 3+ существует CollectionViewSource.

http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource(v=vs.95).aspx

Существует простой способ определить в XAML порядок сортировки по умолчанию, предложенный Microsoft:

Объявить сортировку в разметке с помощью CollectionViewSource

 <Window.Resources>
   <app:MyData x:Key="MyData"/>
   <CollectionViewSource x:Key="cvs" Source={StaticResource MyData}>
     <CollectionViewSource.SortDescriptions>
        <SortDescription Property="Name"/>
     </CollectionViewSource.SortDescriptions>
   </CollectionViewSource>
 </Window.Resources>

 <DataGrid ItemsSource="{Binding Source={StaticResource cvs}}"/> 

найдено в комментариях в https://connect.microsoft.com/VisualStudio/feedback/details/678782/set-default-sort-order-of-datagrid.

Моя поправка к образцу Microsoft:

 <sort:SortDescription 
   PropertyName="Name"
   Direction="Ascending"
   xmlns:sort="clr-namespace:System.ComponentModel;assembly=System.Windows"
   /> 
person George Birbilis    schedule 17.07.2014