如何在重新排序数据网格的列后获取新的列顺序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在重新排序数据网格的列后获取新的列顺序?相关的知识,希望对你有一定的参考价值。

在数据网格中拖放一些列之后,如何以MVVM方式将新订单传递给Viewmodel?

EventArgs非常奇怪。

DataGrid_Reordered传递一个只包含一个列的DataGridColumnEventArgs。我该怎么办呢?我怎么知道列的新顺序?

显然,列的顺序由DisplayIndex确定,但我如何知道旧值是什么以及新值是什么以及它与整个列的集合有何关系?

非常感谢,

答案

不错的问题:-)我猜你是在重启应用程序后持久化列顺序之后。

我不太喜欢网格,所以我没有任何具体的建议,但听起来像你最终会在视图模型(或新的视图模型)中得到一堆属性列和它们的顺序。

我想你必须关闭AutoGenerateColumns,在Xaml中定义你需要的列,并在每列的Header和DisplayIndex属性上使用双向绑定来绑定到VM中的适当值。

这样,您可以使用MVVM Light中的EventToCommand行为,将其绑定到网格的ColumnReordering事件和视图模型中的RelayCommand。由于VM负责保存列的顺序,因此当事件触发时,它将在那里保存。

HTH

另一答案

在我的页面中,我使用LoadedColumnDisplayedIndexChanged的事件设置DataGrid。这对两者都很重要,我将解释一下。

<DataGrid x:Name="dataGrid"
              Loaded="dataGrid_Loaded" 
              ColumnDisplayIndexChanged="dataGrid_ColumnDisplayIndexChanged" 
              ItemsSource="{Binding modulecollection, 
                            Source={StaticResource viewmodel}}"/>

一旦事件发生,我就会把发送者投射到DataGrid。然后访问所有列对象的DataGrid.Columns

我将它发送到另一个函数,该函数从DataGridColumn类创建一个快速的列名列表。数组的索引与其他地方的列引用顺序保持同步。你可以创建你想要的任何东西,keyvaluepair,另一个类,并利用你想要的DataGridColumn类中的任何对象。只是取决于它是如何设置的。

        string [] displayedColumnOrder;

    private void dataGrid_ColumnDisplayIndexChanged( object sender , DataGridColumnEventArgs e )
    {
        DataGrid _dataGrid = ( DataGrid ) sender;
        _getColumnOrder( _dataGrid.Columns );        
    }

    private void dataGrid_Loaded( object sender , RoutedEventArgs e )
    {
        DataGrid _datagrid = ( DataGrid ) sender;  
        _getColumnOrder( _datagrid.Columns );
    }
    void _getColumnOrder( IEnumerable<DataGridColumn> columnCollection )
    {
        DataGridColumn [] columnArray;
        int columnIndexWorking;
        displayedColumnOrder = new string [columnCollection.Count() ];
        columnArray = columnCollection.ToArray();

        foreach( var item_Column in columnCollection )
        {
            columnIndexWorking = item_Column.DisplayIndex;
            displayedColumnOrder [ columnIndexWorking ] = item_Column.Header.ToString();         
        }                                                                                        
    }

好的,您需要来自Loaded的活动才能获得基线。这里我的DataGrid从一个绑定源加载,所以我不会有我的列顺序的基线,除非我在加载网格时捕获它。

您需要ColumnDisplayedIndexChanged,因为您想要跟踪列顺序的更改。

我发现一件重要的事情,当用户将列移动几行时,ColumnDisplayedIndexChanged将为每个索引移动它。如下所示,由于移动了一列,因此将为每个移动的空间触发事件。此外,DataGridColumn的Header对象为null。因此,如果您使用这种方法要小心,您可能需要添加一些额外的处理。或者利用它来跟踪对变化的响应。示例:除非headervalue不为null,否则不要在后台线程中重新计算某些内容。

原版的:

A|B|C   <- Column Name
0|1|2   <- Column Index

用户更改为:

B|C|A
0|1|2

用户移动一列,ColumnDisplayedIndexChanged事件像这样:

第一次:

  null | B | C
  0    | 1 | 2

第二次活动:

  B  | null | C
  0  |  1   | 2

自发展示:

  B | C | A
  0 | 1 | 2

以上是关于如何在重新排序数据网格的列后获取新的列顺序?的主要内容,如果未能解决你的问题,请参考以下文章

db2数据库某一个表增加新列后,如何改变该列在表中的排序?表右方的“上移”和“下移”好像都用不了。

如何以编程方式重新排序primefaces数据表中的列

使用Angularjs重新排序html表中的列

在 WPF 和 XAML 中,如何让行详细信息的列在跳过多个列后动态更改以在父行下对齐?

如何根据多列对 flex 数据网格进行排序?

当单击反转排序顺序的列标题时存储一个布尔值