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

  • 相关阅读:
    CSP2020 T1儒略日 暴力模拟90pts代码
    CSP-S 2019 D1T2括号树
    P3593 [POI2015]TAB
    P5145 漂浮的鸭子
    CH0503 奇数码问题
    [NOIP2012]国王游戏 -高精度-贪心-
    费解的开关
    P1040 加分二叉树
    初步学习线段树
    P2758 编辑距离 简单DP
  • 原文地址:https://www.cnblogs.com/maigc249/p/5110478.html
Copyright © 2011-2022 走看看