我正在尝试将多个选定行从一个 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/