在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;
}
我找不到的是默认情况下如何在“分数”栏中排序。
任何人都可以帮我指出正确的方向吗?
答案 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();