调用 SelectAllCells() 后恢复数据网格中的原始选择

Restore original selection in datagrid after calling SelectAllCells()

我的 DataGrid 控件有一个右键单击上下文菜单。它的菜单项之一是 'Copy All'。当用户单击 'Copy All' 时,它应该将所有数据网格内容复制到剪贴板,以便用户可以将其粘贴到 Excel。

我正在查看 ApplicationCommands.Copy 命令,但它似乎只适用于 selected 项目。所以我试图 select 我的命令处理程序中的所有单元格,执行复制命令,然后取消 select 所有单元格:

SelectAllCells();
ApplicationCommands.Copy.Execute(null, this);
UnselectAllCells(); 

但是,如果用户 select 编辑了几行(例如第 1,3 和 5 行)并单击 'Copy All' 会怎么样?在这种情况下,我应该在 selecting 所有单元格并执行复制命令后恢复他的 selection。我怎样才能做到这一点?

有点繁琐,但可以做到。 基本前提是记下您 select 在 select 一切之前编辑的内容;然后重新select复制后的那些记录。

不是 ToList() 之后的 Distinct() 很重要。由于 LINQ 的延迟执行,没有它就无法工作。

我还添加了代码来禁用调度程序处理。这将阻止在调度程序上处理消息(即,将停止在进行编程操作时尝试重绘屏幕)

        var selectionMode = dg.SelectionMode;
        var token = Application.Current.Dispatcher.DisableProcessing();

        var selectedItems = dg.SelectedCells.Select(x => x.Item).Distinct().ToList();

        try
        {
            dg.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
            dg.SelectionMode = DataGridSelectionMode.Extended;
            dg.SelectAll();
            ApplicationCommands.Copy.Execute(null, dg);
        }
        catch
        {
        }
        finally
        {
            dg.SelectionMode = selectionMode;
            dg.UnselectAll();

            foreach (var selectedItem in selectedItems)
            {
                dg.SelectedItems.Add(selectedItem);

                var row = dg.ItemContainerGenerator.ContainerFromItem(selectedItem) as DataGridRow;

                if (row != null)
                {
                    DataGridCell cell = GetCell(dg, row, 0);

                    if (cell != null)
                    {
                        cell.Focus();
                    }
                }
            }

            token.Dispose();
        }

dg 是 DataGrid 的名称。

静态 GetCell 方法的代码可以在此 link.

上找到