Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF Datagrid多重选择在拖动时丢失_C#_Wpf_Datagrid_Drag And Drop - Fatal编程技术网

C# WPF Datagrid多重选择在拖动时丢失

C# WPF Datagrid多重选择在拖动时丢失,c#,wpf,datagrid,drag-and-drop,C#,Wpf,Datagrid,Drag And Drop,我正在尝试将多个选定行从一个DataGrid拖到另一个DataGrid。为此,我为MouseMove事件使用了如下处理程序: private void Distribution_MouseMove(object sender, MouseEventArgs e) { base.OnMouseMove(e); if (e.LeftButton == MouseButtonState.Pressed) { var

我正在尝试将多个选定行从一个DataGrid拖到另一个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);
            }
        }
    }
private void Distribution\u MouseMove(对象发送方,MouseEventArgs e)
{
基地移动(e);
如果(e.LeftButton==鼠标按钮状态。按下)
{
var dg=发送方作为数据网格;
如果(dg==null)返回;
如果(dg.SelectedItems.Count==0)返回;
点p=e.GetPosition(本);
HitTestResult=VisualTreeHelper.HitTest(这个,p);
var obj=result.VisualHit;
while(visualtreeheloper.GetParent(obj)!=null&&!(obj是DataGridRow))
{
obj=VisualTreeHelper.GetParent(obj);
}
if(obj==null)返回;
var row=obj作为DataGridRow;
if(row==null)返回;
if(dg.SelectedItems.Contains(row.DataContext))
{
e、 已处理=正确;
数据对象数据=新的数据对象();
data.SetData(“registries”,dg.SelectedItems.Cast().ToList());
DragDrop.DoDragDrop(this、data、DragDropEffects.Move);
}
}
}
问题是,选中多行后,单击拖放会使单击的行成为唯一选中的行,并且仅移动该行


在更改选择之前,如何保留多重选择或使用什么其他事件开始拖动?

多亏了您,我找到了答案

首先,我添加了一个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>());
    }

它可以在网格中清楚地显示被取消选择并再次选择的元素,但它的工作原理与预期相同。

如果发生
PreviewMouseMove
事件,您应该尝试使用
PreviewMouseMove
@KingKing,而不是
PreviewMouseMove
显示相同的问题。我试图在
[Preview]MouseLeftButtonDown
中执行此操作,但我无法在不破坏正常选择行为的情况下使其正常工作。感谢此功能,我还有一个附加功能:您只希望在选中用户单击的行时填充所选列表。否则,即使您选择了另一项并立即开始拖动,也会拖动旧选择。因此,您可以使用var row=FindVisualParent(例如,OriginalSource作为FrameworkElement);如果(row!=null&&row.IsSelected)_selected.AddRange(dg.SelectedItems.Cast());
                foreach (var registry in _selected)
                {
                    if (!dg.SelectedItems.Contains(registry))
                    {
                        dg.SelectedItems.Add(registry);
                    }
                }