操作DataGrid中,鼠标点击选中与后台选中有点不一样,鼠标点击选中时,再按shift or Ctrl +左键会原有鼠标选中状态会保持,而后台选中再按shift or Ctrl +左键却不会保持,查看源码了解到鼠标点击选中与后台设置选中项有一个私有变量的值不同,该变量为_selectionAnchor,作用来记录上次在DataGrid的点击位置,当进行按shift or Ctrl +左键操作时,会使用该值,实现Ctrl及Shift的多选操作,为了实现后台选中到鼠标点击选中一样的行为,需要在后台设置选中后进行_selectionAnchor的设置,方法如下:
//后台绑定datagrid的SelectionItem事件时,anchor为null,致使shift多选出错 public static void FreshDataGridSelectionAnchor( this DataGrid datagrid) { if (null == datagrid) return; if (datagrid.SelectedIndex < 0) return; var anchorField = datagrid.GetType() .GetField( "_selectionAnchor" , BindingFlags.Instance | BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.ExactBinding); if (null == anchorField) return; var anchorValue = anchorField.GetValue(datagrid); if (null == anchorValue) { var row = (DataGridRow ) datagrid .ItemContainerGenerator.ContainerFromIndex( datagrid.SelectedIndex); var presenter = GetVisualChild <DataGridCellsPresenter>( row); var cell = (DataGridCell ) presenter .ItemContainerGenerator.ContainerFromIndex(0); if (null == cell) return; anchorField.SetValue(datagrid , new DataGridCellInfo( cell)); } }
访方法执行后再进行shift及Ctrl操作的行为将与直接点击一致。