我有一个 DataGrid,它是数据绑定(bind)到 Collection View 源的。
如果我将 DataGrid 绑定(bind)到 List
如果绑定(bind)到 CollectionViewSource,列标题仍会显示为 DataGrid 将排序的指示,但它不会排序。 我怎样才能实现相同的功能?
这是我的数据网格:
<DataGrid Grid.Row="1" SelectedItem="{Binding SelectedItem}"
SelectionMode="Single" SelectionUnit="FullRow" AutoGenerateColumns="False" ItemsSource="{Binding CurrentErrorsViewSource.View}"
CanUserSortColumns="True" CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTemplateColumn CanUserResize="False">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl Template="{StaticResource ErrorRemoteControl}" Foreground="{StaticResource GlyphBrush}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="{userInterface:Translation Description}" Binding="{Binding Path=(viewModels:ErrorItemViewModel.ErrorInformation).Description}" Width="Auto" />
<DataGridTextColumn Header="{userInterface:Translation Code}" Binding="{Binding Path=(viewModels:ErrorItemViewModel.ErrorCode)}" Width="Auto" />
</DataGrid.Columns>
</DataGrid>
最佳答案
您可以处理 DataGrid 的 Sorting
事件,并在代码隐藏中创建适当的 SortDescription 对象并将它们添加到 CollectionViewSource 的 SortDescriptions 集合中。
void SortHandler(object sender, DataGridSortingEventArgs e)
{
var collectionViewSource = (sender as DataGrid).ItemsSource as CollectionViewSource;
var propertyName = e.Column.SortMemberPath;
var sortDirection = ListSortDirection.Ascending;
foreach (var sortDescription in collectionViewSource.SortDescriptions)
if (sortDescription.PropertyName == propertyName &&
sortDescription.Direction == ListSortDirection.Ascending)
{
sortDirection = ListSortDirection.Descending;
break;
}
var sortDescription = new SortDescription()
{
PropertyName = propertyName,
Direction = sortDirection
};
collectionViewSource.SortDescriptions.Clear();
collectionViewSource.SortDescriptions.Add(sortDescription);
}
关于c# - 使用 CollectionViewSource 对 ColumnHeader 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30893109/