Предварительная сортировка DataGrid в WPF - PullRequest
26 голосов
/ 26 октября 2009

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

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

Ответы [ 5 ]

43 голосов
/ 26 октября 2009

Предполагая, что вы говорите о элементе управления WPG Toolkit DataGrid, вам нужно только установить свойство 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}}">
18 голосов
/ 29 июля 2011

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

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

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

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

4 голосов
/ 18 декабря 2009

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

<DataGrid DataContext="{StaticResource MyItemsViewSource}" ItemsSource="{Binding}">
</DataGrid>
2 голосов
/ 11 ноября 2009

Когда вы видите исключение 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
    }
}
0 голосов
/ 29 мая 2017

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

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