zoukankan      html  css  js  c++  java
  • 后台绑定datagrid的SelectionItem事件时,anchor为null,致使shift多选出错

      操作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操作的行为将与直接点击一致。

  • 相关阅读:
    Hibernate——openSession和getCurrentSession区别
    Oracle存储过程分页 详解
    如何破解mysql数据库的密码
    Oracle约束详解
    Oracle分页查询
    Oracle如何管理权限和角色
    悲观锁和乐观锁详解
    Oracle控制结构详解
    Rose建模之各模型分析
    div布局中将页面居中的方法
  • 原文地址:https://www.cnblogs.com/maigc249/p/5110478.html
Copyright © 2011-2022 走看看