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

Я хочу указать порядок по умолчанию при запуске, но все же разрешить пользователю сортировку, щелкнув заголовки столбцов. К сожалению, свойство 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>

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

Ответ 1

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

По ссылке выше:

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

Ответ 3

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

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));
        }
    }

Ответ 4

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

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