选择不同节点时从 TreeView 中的 Drop 事件获取 TreeViewItem

Getting a TreeViewItem from the Drop event in a TreeView when a different node is selected

我从 ListBox 拖放到 TreeView,我遇到的问题是我只能看到从 TreeView 发件人在 Drop 事件下返回的 "IsSelected" 节点,这是因为我从 TreeViewItem 的列表框中选择 属性 并将其拖到另一个 TreeViewItem 中。

我希望这是有道理的。

我无法从 "dropped" TreeViewItem 中获取数据,我目前有这些方法,但是我无法获取我将 ListBoxItem 放入其中的 TreeViewItem。

private void nodeTree_Drop(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent("copyProperty"))
    {
        BasePropertyTypeVM dragged = e.Data.GetData("copyProperty") as BasePropertyTypeVM;
    }
}

private void NodeTree_OnDragEnter(object sender, DragEventArgs e)
{
    if (!e.Data.GetDataPresent("copyProperty") ||
        sender == e.Source)
    {
        e.Effects = DragDropEffects.None;
    }
}

private void NodeTree_OnDragOver(object sender, DragEventArgs e)
{
    TreeViewItem treeViewItem = FindAncestor<TreeViewItem>((DependencyObject) e.OriginalSource);
    if (treeViewItem != null)
    {
        treeViewItem.Background = Brushes.Blue;
    }
}

private void NodeTree_OnDragLeave(object sender, DragEventArgs e)
{
    TreeViewItem treeViewItem = FindAncestor<TreeViewItem>((DependencyObject) e.OriginalSource);
    if (treeViewItem != null)
    {
        treeViewItem.Background = Brushes.White;
    }
}

所以我设法做到了。我使用查找祖先方法获取 treeviewitem object 然后使用此 object 中的 header 并将其转换为我用来创建树视图的 NodeTreeVM object .

private void nodeTree_Drop(object sender, DragEventArgs e)
    {
        //find the ancestor using the below method, this gets the TreeViewItem Object
        TreeViewItem treeViewItem = FindAncestor<TreeViewItem>((DependencyObject)e.OriginalSource);
        if (treeViewItem != null)
        {
           treeViewItem.Background = Brushes.White;
           //Convert the header into the origional object
           var droppedNode = (TreeNodeVM)treeViewItem.Header;
        }
    }

private static T FindAncestor<T>(DependencyObject current) where T : DependencyObject
    {
        // Search the VisualTree for specified type
        while (current != null)
        {
            if (current is T)
            {
                return (T) current;
            }
            current = VisualTreeHelper.GetParent(current);
        }
        return null;
    }

我希望这对其他人也有帮助,请发表评论以获取更多信息:)