DataGrid SortDirection игнорируется - PullRequest
       10

DataGrid SortDirection игнорируется

13 голосов
/ 19 декабря 2011

Я хочу указать порядок по умолчанию при запуске, но все же разрешить пользователю сортировать, нажимая на заголовки столбцов. К сожалению, свойство SortDirection игнорируется при его установке - то есть мы получаем правильную стрелку заголовка столбца, но ничего не сортируется.

Нажатие на заголовки вручную, сортирует данные правильно, так что это не сама сортировка. Это упрощенная версия, которую я использую:

<DataGrid ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=CurrentView}" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Header 1" Binding="{Binding ApplicationName}"/>
        <DataGridTextColumn Header="Header 2" 
               Binding="{Binding TotalTime}" SortDirection="Descending"/>
    </DataGrid.Columns>
</DataGrid>

Обновление: я также попытался добавить SortDescription в ICollectionView, как было предложено, без хороших результатов. Может ли это быть связано с тем, что я динамически добавляю новые элементы в коллекцию? То есть при запуске список пуст и медленно заполняется, а может быть, сортировка описывается только один раз?

Ответы [ 4 ]

13 голосов
/ 19 декабря 2011

Взгляните на этот Блог MSDN

Сверху ссылка:

DataGridColumn.SortDirection фактически не сортирует столбец.
DataGridColumn.SortDirection используется для помещения в очередь визуальной стрелки в DataGridColumnHeader, указывающей вверх, вниз или не отображаемой. Чтобы фактически отсортировать столбцы, кроме нажатия на DataGridColumnHeader, вы можете установить DataGrid.Items.SortDescription программным способом.

4 голосов
/ 19 декабря 2011

У меня нет личного опыта с этим, но я нашел эту довольно полезную статью .

По сути вам нужно добавить SortDescription в CollectionViewSourceчто DataGrid связан с.

2 голосов
/ 07 февраля 2012

Эта статья была очень полезной.Я смог использовать его, чтобы найти несколько простое решение.Вот фрагмент моего решения, которое сработало.

XAML

        <DataGrid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
            AutoGenerateColumns="False" ItemsSource="{Binding LogLister.Logs}"              
            IsReadOnly="True" >

            <DataGrid.Columns>                  

                <DataGridTextColumn Binding="{Binding TimeStampLocal}" Header="Time" x:Name="ColTimeStamp" />

                <DataGridTextColumn Binding="{Binding Text}" Header="Text"/>
            </DataGrid.Columns>
        </DataGrid>

Код

    // Using a DependencyProperty as the backing store for ViewModel.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ViewModelProperty =
        DependencyProperty.Register("ViewModel", typeof(LogViewerViewModel), typeof(LogViewerControl),
           new UIPropertyMetadata(null,pf_viewModelChanged));

    private static void pf_viewModelChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
    {
        var control = (LogViewerControl)o;

        control.ColTimeStamp.SortDirection = ListSortDirection.Descending;

        var vm = e.NewValue as LogViewerViewModel;

        if (vm != null)
        {   
            ICollectionView collectionView = CollectionViewSource.GetDefaultView(vm.LogLister.Logs);
            collectionView.SortDescriptions.Add(new SortDescription("TimeStampLocal", ListSortDirection.Descending));
        }
    }
1 голос
/ 19 декабря 2011

Суть в том, что нет простого и быстрого способа сделать это.Я написал свой собственный сортировщик, который использует метод Move в ObservableCollections.Я переопределяю событие «DataGridSorting» и вызываю свои собственные методы, чтобы облегчить это.Я не собираюсь публиковать здесь код, потому что я думаю, что он слишком преувеличен для вашего вопроса.

Я бы сказал, придерживайтесь моего комментария выше, используя CollectionViewSource и SortDescription (изначально размещен компетентный_техник).

...