Подтвердить что ты не робот

Предварительная сортировка DataGrid в WPF

У меня есть DataGrid в приложении WPF с несколькими столбцами, включая столбец Name. Если пользователи переключаются на определенное представление, я хочу, чтобы данные были предварительно отсортированы по имени (и я хотел бы, чтобы стрелка сортировки отображалась в заголовке Name так же, как если бы пользователь нажал этот заголовок). Однако я не могу найти ожидаемые свойства, чтобы это произошло. Я искал что-то вроде SortColumn, SortColumnIndex, SortDirection и т.д.

Можно ли указать столбец и направление сортировки по умолчанию в разметке (XAML) или это не поддерживается WPF Toolkit DataGrid?

4b9b3361

Ответ 1

Предполагая, что вы говорите об элементе управления DataGrid Toolkit WPF, вам нужно установить свойство CanUserSortColumns в true, а затем установить свойство SortMemberPath каждого DataGridColumn в DataGrid.

Что касается сортировки коллекции изначально, вы должны использовать CollectionViewSource и установить сортировку, а затем назначить это как ItemsSource вашего DataGrid. Если вы делаете это в XAML, это будет так же просто, как:

<Window.Resources>
    <CollectionViewSource x:Key="MyItemsViewSource" Source="{Binding MyItems}">
        <CollectionViewSource.SortDescriptions>
           <scm:SortDescription PropertyName="MyPropertyName"/>
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>
</Window.Resources>

<DataGrid ItemsSource="{StaticResource MyItemsViewSource}">

</DataGrid>

ПРИМЕЧАНИЕ. префикс пространства имен scm сопоставляется с System.ComponentModel, в котором живет класс SortDescription.

xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"

РЕДАКТИРОВАТЬ: Я думаю, что люди получили помощь от этого поста, что этот ответный комментарий должен быть включен в этот ответ:

Мне пришлось использовать это, чтобы заставить его работать:

<DataGrid ItemsSource="{Binding Source={StaticResource MyItemsViewSource}}">

Ответ 2

Я знаю, что это старый пост, но в дополнение к ответу Дрю Марша и в ответ на проблему DanM с заголовками заголовка столбца, которые не появляются... Вам нужно добавить свойство SortDirection в DataGridColumn:

<DataGridTextColumn Header="Name" Binding="{Binding Name}" SortDirection="Ascending" />

Я разместил вопрос об этом и нашел ответ через несколько дней:

Стрелки ColumnHeader не отображаются при сортировке DataGrid в XAML

Ответ 3

Когда вы видите, что ItemsSource не поддерживает исключение CollectionViewSource, вы можете установить DataContext DataGrid как "MyItemsViewSource" и ItemsSource как {Binding} следующим образом:

<DataGrid DataContext="{StaticResource MyItemsViewSource}" ItemsSource="{Binding}">
</DataGrid>

Ответ 4

Когда вы видите исключение ItemsSource doesn't support CollectionViewSource, вы можете сортировать коллекции Linq, прежде чем ссылаться на DataGrid:

ObservableCollection<MyDataClass> myCollection = new ObservableCollection<MyDataClass>();
dataGrid.ItemsSource = from item in myCollection orderby item select item;

Вам нужно реализовать интерфейс IComparable для MyDataClass:

public class MyDataClass : IComparable<MyDataClass> {
    public int CompareTo(Classified other) {
        return other.Value.CompareTo(this.Value); // DESC
        return this.Value.CompareTo(other.Value); // ASC
    }
}

Ответ 5

Это работает для меня.

ListSortDirection sortDirection;
int selectedColumnIndex;
private void customerDataGrid_Sorting(object sender, DataGridSortingEventArgs e)
{
    selectedColumnIndex = e.Column.DisplayIndex;
    sortDirection = (e.Column.SortDirection == ListSortDirection.Ascending ? ListSortDirection.Descending: ListSortDirection.Ascending);
}

private void applySortDescriptions(ListSortDirection listSortDirection)
{
    //Clear current sort descriptions 
    customerDataGrid.Items.SortDescriptions.Clear();

    //Get property name to apply sort based on desired column 
    string propertyName = customerDataGrid.Columns[selectedColumnIndex].SortMemberPath;

    //Add the new sort description 
    customerDataGrid.Items.SortDescriptions.Add(new SortDescription(propertyName, listSortDirection));

    //apply sort 
    applySortDirection(listSortDirection);

    //refresh items to display sort 
    customerDataGrid.Items.Refresh();
}

private void applySortDirection(ListSortDirection listSortDirection)
{
    customerDataGrid.Columns[selectedColumnIndex].SortDirection = listSortDirection;
}