WPF中的Datagrid - 1列默认排序

时间:2012-01-22 17:10:36

标签: c# wpf sorting datagrid

在WPF中,我有一个包含几列的DataGrid。

默认情况下,有1个我想让它排序,但我不知道如何做到这一点。

XAML中的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" />
                <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 个答案:

答案 0 :(得分:46)

  

注意:使用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>

这将默认按向上方向排序到第二列。

答案 1 :(得分:9)

我在此处首先介绍了如何对代码进行排序:Initial DataGrid Sorting

您可以调整代码以按特定的所需列进行排序,尽管整个方法看起来很混乱。

如果你想在XAML中做...可能有用的是设置CollectionViewSource.SortDescriptions:

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

但我从未尝试过后者。

答案 2 :(得分:3)

如果你想以编程方式进行,你可以这样做:

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

答案 3 :(得分:2)

您可以在代码中使用ICollectionView。 假设您已定义ObservableCollection<yourPersonClass> Persons并且Names是yourPersonClass的属性

public ICollectionView View; 
View = CollectionViewSource.GetDefaultView(Persons);
View.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
View.Refresh();