在数据网格中拖放某些列后,如何以MVVM方式将新顺序传递给视图模型?EventArgs非常奇怪。DataGrid_Reordered传递一个仅包含单个列的DataGridColumnEventArgs。我应该怎么处理它?我如何知道列的新顺序?显然,列的顺序是通过DisplayIndex确定的,但我如何知道旧值和新值是什么,以及这与整个列集相关的情况如何?谢谢。
在我的页面中,我使用了DataGrid,并设置了Loaded
和ColumnDisplayedIndexChanged
事件。这两个事件都很重要,我会在下面解释。
<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