Сетка данных в WPF - 1 столбец отсортирован по умолчанию - PullRequest
25 голосов
/ 22 января 2012

В WPF у меня есть DataGrid с несколькими столбцами.

По умолчанию есть 1, к которому я хочу сделать сортировку, но я просто не могу найти, как я могу это сделать.

DataGrid в XAML выглядит следующим образом:

<DataGrid x:Name="LibraryView" ItemsSource="{Binding Path=Elements[Persons]}" IsReadOnly="True" LoadingRow="dg_LoadingRow">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Path=Element[Name].Value}" IsReadOnly="True" />
                <DataGridTextColumn Header="Score" Binding="{Binding Path=Element[Score].Value}" IsReadOnly="True" />
                <DataGridTextColumn Header="Date" Binding="{Binding Path=Element[Date].Value}" IsReadOnly="True" />
            </DataGrid.Columns>
        </DataGrid>

И единственный код позади него:

public ScoreBoard()
{
    InitializeComponent();
    DataSet ds = dweMethods.DecryptAndDeserialize("ScoreData.xml");
    XElement TrackList = XElement.Parse(ds.GetXml());
    LibraryView.DataContext = TrackList;
}

Чего я просто не могу найти, так это сделать по умолчаниюотсортировано по столбцу «Оценка».

Может кто-нибудь помочь мне указать мне правильное направление?

Ответы [ 4 ]

47 голосов
/ 10 января 2014

ПРИМЕЧАНИЕ: Использование CollectionViewSource предоставит вам больше власти и контроля в этих ситуациях. Когда вы изучаете WPF, я рекомендую понять, как использовать CollectionViewSource для решения этой проблемы вместе с другой коллекцией связанные с этим проблемы, такие как группировка и фильтрация .

РЕДАКТИРОВАТЬ: Это может быть связано с изменениями в спецификации. Этот ответ основан на использовании .NET 4.0, я не исследовал, будет ли это решение работать в более старых версиях платформы.

Учитывая это XAML

<DataGrid x:Name="LibraryView" ItemsSource="{Binding Path=Elements[Persons]}" IsReadOnly="True" LoadingRow="dg_LoadingRow">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Path=Element[Name].Value}" IsReadOnly="True" />
            <DataGridTextColumn Header="Score" Binding="{Binding Path=Element[Score].Value}" IsReadOnly="True" />
            <DataGridTextColumn Header="Date" Binding="{Binding Path=Element[Date].Value}" IsReadOnly="True" />
        </DataGrid.Columns>
    </DataGrid>

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

<DataGrid x:Name="LibraryView" ItemsSource="{Binding Path=Elements[Persons]}" IsReadOnly="True" LoadingRow="dg_LoadingRow">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Path=Element[Name].Value}" IsReadOnly="True" />
                <DataGridTextColumn Header="Score" Binding="{Binding Path=Element[Score].Value}" IsReadOnly="True" SortDirection="Ascending" />
                <DataGridTextColumn Header="Date" Binding="{Binding Path=Element[Date].Value}" IsReadOnly="True" />
            </DataGrid.Columns>
        </DataGrid>

По умолчанию сортировка выполняется по второму столбцу в восходящем направлении.

10 голосов
/ 23 января 2012

Я описал, как сортировать код по первым столбцам здесь: Начальная сортировка DataGrid

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

Если вы хотите сделать это в XAML ... что может сработать, так это настройка CollectionViewSource.SortDescription:

<CollectionViewSource x:Key="cvs" Source="{StaticResource myItemsSource}">
    <CollectionViewSource.SortDescriptions>
        <scm:SortDescription PropertyName="MyPropertyName" Direction="Ascending"/>
    </CollectionViewSource.SortDescriptions>
</CollectionViewSource>

Но я никогда не пробовал последнее.

3 голосов
/ 02 декабря 2015

Если вы хотите сделать это программно, вы можете сделать это так:

 MyDataGrid.ItemsSource = DataContext.RowItems.OrderBy(p => p.Score).ToList();
2 голосов
/ 06 июня 2018

Вы можете использовать ICollectionView в своем коде.Предполагая, что вы определили ObservableCollection<yourPersonClass> Persons и Names является свойством вашегоPersonClass

public ICollectionView View; 
View = CollectionViewSource.GetDefaultView(Persons);
View.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
View.Refresh();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...