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

3
在数据网格中拖放某些列后,如何以MVVM方式将新顺序传递给视图模型?EventArgs非常奇怪。DataGrid_Reordered传递一个仅包含单个列的DataGridColumnEventArgs。我应该怎么处理它?我如何知道列的新顺序?显然,列的顺序是通过DisplayIndex确定的,但我如何知道旧值和新值是什么,以及这与整个列集相关的情况如何?谢谢。

1
也许这个答案对你有用https://dev59.com/P0nSa4cB1Zd3GeqPLza4 - LPL
2个回答

2

在我的页面中,我使用了DataGrid,并设置了LoadedColumnDisplayedIndexChanged事件。这两个事件都很重要,我会在下面解释。

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

无论哪个事件触发,我都会将发送方转换为DataGrid。 然后访问DataGrid.Columns以获取所有列对象。

我将此发送到另一个函数,该函数从DataGridColumn类创建快速数组。 数组的索引与其他地方引用的列的顺序保持同步。 您可以创建任何您想要的东西,例如键值对、另一个类,并利用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不为空时才不要在后台线程中重新计算某些内容。

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

1
很好的问题 :-) 我猜你想要在应用程序重新启动后保持列顺序的持久性。
我不太喜欢网格,所以我没有具体的建议,但我觉得你最终会在你的视图模型中拥有一堆属性(或一个新的视图模型),来模拟列和它们的顺序。
我猜你需要关闭AutoGenerateColumns,在Xaml中定义你需要的列,并在每个列的Header和DisplayIndex属性上使用双向绑定,将其绑定到VM中适当的值。这样,你就可以使用MVVM Light中的EventToCommand行为,将其绑定到网格的ColumnReordering事件以及视图模型中的RelayCommand。由于VM负责保存列的顺序,所以当事件触发时,你就可以在那里找到它。
希望能对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接