忽略数据网格排序方向

本文关键字:排序 方向 网格 数据网 数据 | 更新日期: 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最初发布)。