c# - WPF Datagrid 多项选择在拖动时丢失

标签 c# wpf datagrid drag-and-drop

我正在尝试将多个选定行从一个 DataGrid 拖到另一个。为此,我正在为 MouseMove 事件使用处理程序,如下所示:

    private void Distribution_MouseMove(object sender, MouseEventArgs e)
    {
        base.OnMouseMove(e);
        if (e.LeftButton == MouseButtonState.Pressed)
        {
            var dg = sender as DataGrid;
            if (dg == null) return;
            if (dg.SelectedItems.Count == 0) return;

            Point p = e.GetPosition(this);
            HitTestResult result = VisualTreeHelper.HitTest(this, p);
            var obj = result.VisualHit;

            while (VisualTreeHelper.GetParent(obj) != null && !(obj is DataGridRow))
            {
                obj = VisualTreeHelper.GetParent(obj);
            }
            if (obj == null) return;

            var row = obj as DataGridRow;
            if (row == null) return;

            if (dg.SelectedItems.Contains(row.DataContext))
            {
                e.Handled = true;

                DataObject data = new DataObject();
                data.SetData("registries", dg.SelectedItems.Cast<Registry>().ToList());
                DragDrop.DoDragDrop(this, data, DragDropEffects.Move);
            }
        }
    }

问题是,选中多行后,单击拖放会使单击的行成为唯一选中的行,并且只有该行被移动。

我怎样才能保持多重选择或者我应该使用什么其他事件在选择改变之前开始拖动?

最佳答案

感谢 this post,我找到了答案.

首先,我添加了一个 PreviewMouseLeftButtonDown 处理程序,它将所有选定的项目添加到另一个列表:

    private List<Registro> _selected = new List<Registry>();
    private void Distribution_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var dg = sender as DataGrid;
        if (dg == null) return;
        _selected.Clear();
        _selected.AddRange(dg.SelectedItems.Cast<Registry>());
    }

然后在 MouseMove 处理程序上,在 e.Handled = true; 之后和创建 DataObject 之前添加以下内容:

                foreach (var registry in _selected)
                {
                    if (!dg.SelectedItems.Contains(registry))
                    {
                        dg.SelectedItems.Add(registry);
                    }
                }

它清楚地显示了网格中取消选择和再次选择的元素,但它按预期工作。

关于c# - WPF Datagrid 多项选择在拖动时丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25097750/

相关文章:

c# - 使用 Try-Catch 处理看到的错误,不好吗?

c# - FastMember 的 ISO-1 C# 语言规范错误

wpf - 如何使 WPF DataGrid 单元格右对齐而不使新行上的可选区域变小?

apache-flex - 弹性 4.6 : could not resolve <mx:DataGrid> to a component implementation

带有 UI 线程问题的 WPF - TaskFactory、CollectionView 问题 - 语法噩梦

wpf - 如何更改 DataGridComboBoxColumn 中单元格值的前景色?

c# - 为什么要用blank get;放; C# 中的访问器?

c# - Array.ForEach 无法从用法推断数组元素类型

c# - 设置 textBox.Text 不会更新绑定(bind)的双向属性?

c# - 系统.InvalidOperationException : Can not set Visibility