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

Datagrid в WPF-1 сортировка по умолчанию по умолчанию

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

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

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

То, что я просто не могу найти, - это сделать его по умолчанию отсортированным в столбце "Оценка".

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

4b9b3361

Ответ 1

Решение для этого проще, чем дает текущий ответ.

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

EDIT: Это может быть связано с изменениями в спецификации. Этот ответ основан на использовании .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>

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

Ответ 2

Изменить: см. ниже ответ Джеймса ЛаПенна, это должно быть принятое решение.


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

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

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

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

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

Ответ 3

Если вы хотите сделать это программно, вы можете сделать это следующим образом:

 MyDataGrid.ItemsSource = DataContext.RowItems.OrderBy(p => p.Score).ToList();