C# 如何在Drop事件中访问源的父级?
我试图处理一些拖放功能的价值观在我的树状视图。 我特别针对Drop方法。我希望能够访问正在拖动的元素的父对象 是TreeView的财产,我想我需要它。但是,此属性的类型为string,因此访问父对象是一个挑战 我试着用C# 如何在Drop事件中访问源的父级?,c#,wpf,drag-and-drop,treeview,C#,Wpf,Drag And Drop,Treeview,我试图处理一些拖放功能的价值观在我的树状视图。 我特别针对Drop方法。我希望能够访问正在拖动的元素的父对象 是TreeView的财产,我想我需要它。但是,此属性的类型为string,因此访问父对象是一个挑战 我试着用 VisualTreeHelper.GetParent(DependencyObject) 方法,但似乎不存在从字符串到DependencyObject的转换,反之亦然 我可以访问目标的ParentControl,但不能访问源,我不明白为什么 这是我的拖放方法,也是MouseM
VisualTreeHelper.GetParent(DependencyObject)
方法,但似乎不存在从字符串到DependencyObject的转换,反之亦然
我可以访问目标的ParentControl,但不能访问源,我不明白为什么
这是我的拖放方法,也是MouseMove。任何帮助都将不胜感激
private void TreeViewItem_Drop(object sender, DragEventArgs e)
{
if (sender is TreeViewItem target)
{
string source = e.Data.GetData(typeof(string)) as string;
string dropTarget = target.DataContext as string;
var parentControl = VisualTreeHelper.GetParent((TreeViewItem)(sender));
var parentElement = ((VirtualizingStackPanel)(parentControl)).DataContext;
if (parentElement is GroupDecision decision)
{
if (decision.Decisions.Contains(source) && (decision.Decisions.Contains(dropTarget)))
{
int sourceIndex = decision.Decisions.IndexOf(source);
int targetIndex = decision.Decisions.IndexOf(dropTarget);
SwapElements(sourceIndex, targetIndex, decision.Decisions);
}
else
{
if (!decision.Decisions.Contains(source))
{
decision.Decisions.Add(source);
// Remove from old
}
}
}
}
private void TreeViewItem_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
if (TreeView.SelectedItem != null)
{
DragDrop.DoDragDrop(this, TreeView.SelectedItem, DragDropEffects.Move);
}
}
}
在dodragdrop中的treeview.selecteditem在执行e.data.GetData时,数据中会出现什么结果。因为你把它转换成一个字符串,所以它只是一个在内存中浮动的字符串。漂浮在海洋上,而不是在视觉树上。它没有父控件,因为它是一个字符串。 发送方就是你放在上面的任何控件,所以这不是你从中拖出的东西。这正是你想要的 但是。。。作为数据传递的内容可以是您提供的任何内容。
它可以是一个简单的字符串,也可以是一个包含许多属性的复杂业务对象。
当你放下东西时,你想要的东西最好都藏在那个数据里。
在这里的答案中: 这是一个视图模型 我不是真的明白你想从中得到什么,而是
DragDrop.DoDragDrop(this, TreeView.SelectedItem, DragDropEffects.Move);
您应该将所需的内容作为第二个参数
DragDrop.DoDragDrop(this, AmoreComplexObjectWithMoreData, DragDropEffects.Move);
定义一个类,该类的属性与您需要的匹配。新建它并在开始拖动时进行设置。当你放弃时,你就拥有了你所需要的一切。将拖动数据投射回所述类。A
string
没有可视祖先。可能要将所选项目的treevieItem
容器传递给DoDragDrop
方法:
private void TreeViewItem_MouseMove(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
if (TreeView.SelectedItem != null)
{
DragDrop.DoDragDrop(this,
TreeView.ItemContainerGenerator.ContainerFromItem(TreeView.SelectedItem) as TreeViewItem,
DragDropEffects.Move);
}
}
}
然后,您可以在Drop
事件处理程序中获取对可视容器的引用,并根据需要遍历可视树:
TreeViewItem source = e.Data.GetData(typeof(TreeViewItem)) as TreeViewItem;
string sourceObject = source.DataContext as string;
//...
它填充在视图模型的构造函数中调用的方法上。它是一个字符串。TreeView.SelectedItem的父级应该是GroupDecision。这似乎会使程序在拖动后立即崩溃。请提供一个repo,其中包含用示例数据填充TreeView的代码:。
TreeViewItem source = e.Data.GetData(typeof(TreeViewItem)) as TreeViewItem;
string sourceObject = source.DataContext as string;
//...