c# - 重新排序数据网格的列后如何获得新的列顺序?

标签 c# .net wpf silverlight datagrid

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

EventArgs 非常奇怪。

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

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

非常感谢,

最佳答案

在我的页面中,我使用 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 从绑定(bind)源加载,所以我不会有我的列顺序的基线,除非我在加载网格时捕获它。

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

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

原文:

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

关于c# - 重新排序数据网格的列后如何获得新的列顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6665523/

相关文章:

c# - Winforms 选择哪种设计模式/敏捷方法论

c# - Lookup() 和 Dictionary(Of list()) 之间的区别

c# - 您可以使用 MVVM 模式将多个 LineSeries 绑定(bind)到 WPF 中的 oxyplot 吗?

c# - 无法将 Microsoft Tag WebService 引用添加到 MVC 4 项目

c# - 为什么这个 Parallel.ForEach 循环没有提高性能?

C# 在不同程序集中定义重写方法

c# - 如何在 WPF 中捕获从子组件到父组件的激活命令?

wpf - 如何确保我的 WPF TabControl 在包含至少一个选项卡时始终具有选定的选项卡?

c# - 当我 add/text() 时,为什么我的 XPath 会卡在第一个结果上?

c# - 从文本框中删除特定文本