在我的页面中,我使用Loaded 和ColumnDisplayedIndexChanged 的事件设置了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 对象也变为空。因此,如果您使用这种方法要小心,您可能需要添加一些额外的处理。或者利用它来跟踪对更改的响应。示例:除非 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