Getting TreeViewItem for the selected item in a TreeView

后端 未结 4 1357
遥遥无期
遥遥无期 2020-12-31 05:32

I have a TreeView that is bound to a dataset which is having parent child relation. How i will get seleted TreeViewItem from the TreeView? Please help me. My code is below.

相关标签:
4条回答
  • 2020-12-31 05:55

    Try

    TreeViewItem tvi = myTree.ItemContainerGenerator.ContainerFromItem(SelectedItem) as TreeViewItem;
    

    or go through the below links.Hope this helps

    Data binding to SelectedItem in a WPF Treeview

    Get SelectedItem from TreeView?

    http://social.msdn.microsoft.com/forums/en-US/wpf/thread/36aca7f7-0b47-488b-8e16-840b86addfa3/

    0 讨论(0)
  • 2020-12-31 06:05

    This works for trees whose data source is bound via a HierarchicalDataTemplate

    Handle TreeViewItem.Selected

    <TreeView Name="mTreeView" TreeViewItem.Selected="TreeViewItem_OnItemSelected" />
    

    And set the TreeViewItem as the Tag.

    private void TreeViewItem_OnItemSelected(object sender, RoutedEventArgs e)
    {
        mTreeView.Tag = e.OriginalSource;
    }
    

    Which you can retrieve later

    TreeViewItem tvi = mTreeView.Tag as TreeViewItem;
    
    0 讨论(0)
  • 2020-12-31 06:07

    While biju's answer works for flat hierarchies, I had to look for a solution for HierarchicalDataTemplates. This is the extension method that worked for me:

    public static TreeViewItem ContainerFromItemRecursive(this ItemContainerGenerator root, object item)
    {
        var treeViewItem = root.ContainerFromItem(item) as TreeViewItem;
        if (treeViewItem != null)
            return treeViewItem;
        foreach (var subItem in root.Items)
        {
            treeViewItem = root.ContainerFromItem(subItem) as TreeViewItem;
            var search = treeViewItem?.ItemContainerGenerator.ContainerFromItemRecursive(item);
            if (search != null)
                return search;
        }
        return null;
    }
    

    You can use it with

    TreeViewItem tvi = treeView
                           .ItemContainerGenerator
                           .ContainerFromItemRecursive(treeView.SelectedItem);
    
    0 讨论(0)
  • 2020-12-31 06:16

    The best solution I've found involves a simple helper method and can be used in virtually any of the TreeView's events (i.e., SelectedItemChanged, MouseLeftButtonUp, etc.).

    TreeViewItem Item = TreeViewHelper.VisualUpwardSearch(e.OriginalSource as DependencyObject);
    

    I am using multiple hierarchy data templates and this is the only method that worked for me. Now, I'm able to create a new control based on TreeView and can handle all events involving the selected item internally.

    public static TreeViewItem VisualUpwardSearch(DependencyObject source)
    {
        while (source != null && !(source is TreeViewItem)) source = System.Windows.Media.VisualTreeHelper.GetParent(source);
        return source as TreeViewItem;
    }
    
    0 讨论(0)
提交回复
热议问题