C# 如何在Drop事件中访问源的父级?

C# 如何在Drop事件中访问源的父级?,c#,wpf,drag-and-drop,treeview,C#,Wpf,Drag And Drop,Treeview,我试图处理一些拖放功能的价值观在我的树状视图。 我特别针对Drop方法。我希望能够访问正在拖动的元素的父对象 是TreeView的财产,我想我需要它。但是,此属性的类型为string,因此访问父对象是一个挑战 我试着用 VisualTreeHelper.GetParent(DependencyObject) 方法,但似乎不存在从字符串到DependencyObject的转换,反之亦然 我可以访问目标的ParentControl,但不能访问源,我不明白为什么 这是我的拖放方法,也是MouseM

我试图处理一些拖放功能的价值观在我的树状视图。 我特别针对Drop方法。我希望能够访问正在拖动的元素的父对象

是TreeView的财产,我想我需要它。但是,此属性的类型为string,因此访问父对象是一个挑战

我试着用

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;
//...