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

问题描述 投票:2回答:2

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

EventArgs非常奇怪。

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

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

非常感谢,

c# .net wpf silverlight datagrid
2个回答
0
投票

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

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

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

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

HTH


1
投票

在我的页面中,我使用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
© www.soinside.com 2019 - 2024. All rights reserved.