忽略数据网格排序方向
本文关键字:排序 方向 网格 数据网 数据 | 更新日期: 2023-09-27 18:18:09
我想在启动时指定一个默认排序,但仍然允许用户通过单击列标题进行排序。遗憾的是,SortDirection属性在设置时被忽略-即我们得到正确的列标题箭头,但没有排序。
手动单击标题,正确排序数据,所以它不是排序本身。这是我使用的简化版本:
<DataGrid ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=CurrentView}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Header 1" Binding="{Binding ApplicationName}"/>
<DataGridTextColumn Header="Header 2"
Binding="{Binding TotalTime}" SortDirection="Descending"/>
</DataGrid.Columns>
</DataGrid>
更新:我也尝试添加sortdescriptionicollectionview的建议,没有很好的结果。这是否与我正在动态地向集合中添加新项目有关?也就是说,在启动时,列表是空的,慢慢填充,也许排序描述只应用一次?
看看这个MSDN博客
从上面的链接:
DataGridColumn。SortDirection实际上并不对列进行排序。
DataGridColumn。SortDirection用于对DataGridColumnHeader中的可视箭头进行排队,使其向上、向下或不显示。要对列进行实际排序,而不是单击DataGridColumnHeader,您可以通过编程方式设置datagriditems . sortdescriptions。
我个人没有这方面的经验,但是我觉得这篇文章很有帮助。
本质上你需要添加一个SortDescription到DataGrid绑定到的CollectionViewSource
这篇文章很有帮助。我用它找到了一个比较简单的解决方案。下面是我的解决方案的一个片段。
XAML
<DataGrid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
AutoGenerateColumns="False" ItemsSource="{Binding LogLister.Logs}"
IsReadOnly="True" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding TimeStampLocal}" Header="Time" x:Name="ColTimeStamp" />
<DataGridTextColumn Binding="{Binding Text}" Header="Text"/>
</DataGrid.Columns>
</DataGrid>
// Using a DependencyProperty as the backing store for ViewModel. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ViewModelProperty =
DependencyProperty.Register("ViewModel", typeof(LogViewerViewModel), typeof(LogViewerControl),
new UIPropertyMetadata(null,pf_viewModelChanged));
private static void pf_viewModelChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
{
var control = (LogViewerControl)o;
control.ColTimeStamp.SortDirection = ListSortDirection.Descending;
var vm = e.NewValue as LogViewerViewModel;
if (vm != null)
{
ICollectionView collectionView = CollectionViewSource.GetDefaultView(vm.LogLister.Logs);
collectionView.SortDescriptions.Add(new SortDescription("TimeStampLocal", ListSortDirection.Descending));
}
}
缺点是没有快速简便的方法。我编写了自己的自定义排序器,它在ObservableCollections上使用Move方法。我重写了"DataGridSorting"事件,并调用自己的方法来实现这一点。我不打算把代码贴在这里,因为我认为这对你的问题来说太夸张了。
我会说坚持我上面的评论通过使用CollectionViewSource和SortDescription (competent_tech最初发布)。