在数据网格中拖放一些列后,如何以 MVVM 方式将新订单传递给 Viewmodel?
EventArgs 非常奇怪。
DataGrid_Reordered 传递仅包含一个列的 DataGridColumnEventArgs。我该怎么办?我如何知道列的新顺序?
显然,列的顺序由 DisplayIndex 确定,但我如何知道旧值是什么,新值是什么,以及这与整组列有何关系?
非常感谢,
最佳答案
在我的页面中,我使用 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
从绑定(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/