获取 TreeView 中所选项目的 TreeViewItem

Posted

技术标签:

【中文标题】获取 TreeView 中所选项目的 TreeViewItem【英文标题】:Getting TreeViewItem for the selected item in a TreeView 【发布时间】:2011-07-10 06:07:44 【问题描述】:

我有一个绑定到具有父子关系的数据集的 TreeView。我将如何从 TreeView 中获得选中的 TreeViewItem?请帮我。我的代码如下。

xaml:-

<TreeView Name="tvPersonal"  Background="Transparent"  ItemsSource="Binding RootNodes" SelectedItemChanged="tvPersonal_SelectedItemChanged">    
 <TreeView.ItemTemplate>
   <HierarchicalDataTemplate ItemsSource="Binding rsParentChild">
     <TextBlock Text="Binding Name" />
   </HierarchicalDataTemplate>
 </TreeView.ItemTemplate>

 public MainWindow()   

            
            InitializeComponent();    
            DataSet ds = new BL.BLMenu().GetAllMenues(new BOModule  Name = Modules.Personnel );
            ds.Tables[0].TableName = "Menu";
            DataRelation relation = new DataRelation("rsParentChild",
                    ds.Tables["Menu"].Columns["MenuId"],
                    ds.Tables["Menu"].Columns["ParentId"]);
            relation.Nested = true;    
            ds.Relations.Add(relation);
            BOMenu mnu = new BOMenu();    
            BOMenu.RootNodes = ds.Tables["Menu"].DefaultView;
            BOMenu.RootNodes.RowFilter = "ParentId IS NULL";    

            this.DataContext = this;
            stbiDate.Content = DateTime.Now;

        
        public DataView RootNodes    
        
            get  return BOMenu.RootNodes; 
        

BOMenu 类:-

 public class BOMenu
    
        public string MenuId
        
            get;
            set;
        

        public string Name
        
            get;
            set;
        

        public string ParentId
        
            get;
            set;
        

        public int Priority
        
            get;
            set;
        

        public static DataView RootNodes
        
            get;
            set;
        

    

【问题讨论】:

【参考方案1】:

试试

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

或通过以下链接。希望这会有所帮助

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/

【讨论】:

这不适用于数据源通过HierarchicalDataTemplate 绑定的树。 这种方式拿不到孙子。【参考方案2】:

这适用于数据源通过 HierarchicalDataTemplate 绑定的树

处理 TreeViewItem.Selected

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

并将 TreeViewItem 设置为 Tag。

private void TreeViewItem_OnItemSelected(object sender, RoutedEventArgs e)

    mTreeView.Tag = e.OriginalSource;

以后可以检索到

TreeViewItem tvi = mTreeView.Tag as TreeViewItem;

【讨论】:

你怎么能用代码写这个TreeViewItem.Selected="TreeViewItem_OnItemSelected"?我正在尝试基于 TreeView 建立一个新控件,并希望在内部而不是在我需要 TreeView 的每个地方进行处理。我似乎无法在任何地方找到可以通过 TreeViewItem 命名空间附加的事件... 您可以在控件的构造函数中这样做:AddHandler(TreeViewItem.SelectedEvent, new RoutedEventHandler(TreeViewItem_Selected)); private void TreeViewItem_Selected(object sender, RoutedEventArgs e) _selectedTreeViewItem = e.OriginalSource as TreeViewItem; 【参考方案3】:

我发现的最佳解决方案涉及一个简单的辅助方法,几乎​​可以用于 TreeView 的任何事件(即 SelectedItemChanged、MouseLeftButtonUp 等)。

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

我正在使用多个层次结构数据模板,这是对我有用的唯一方法。现在,我可以创建一个基于 TreeView 的新控件,并且可以在内部处理涉及所选项目的所有事件。

public static TreeViewItem VisualUpwardSearch(DependencyObject source)

    while (source != null && !(source is TreeViewItem)) source = System.Windows.Media.VisualTreeHelper.GetParent(source);
    return source as TreeViewItem;

【讨论】:

【参考方案4】:

虽然 biju 的答案适用于平面层次结构,但我不得不为 HierarchicalDataTemplates 寻找解决方案。这是对我有用的扩展方法:

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;

你可以使用它

TreeViewItem tvi = treeView
                       .ItemContainerGenerator
                       .ContainerFromItemRecursive(treeView.SelectedItem);

【讨论】:

看起来这应该可以解决问题! 2012 年我需要这个时你在哪里 :)

以上是关于获取 TreeView 中所选项目的 TreeViewItem的主要内容,如果未能解决你的问题,请参考以下文章

TreeView而不是WebView?

获取列表框中所选项目的值作为字符串

获取下拉框中所选项目的 id 属性

获取 QListWidget PyQt5 中所选项目的名称

Treeview 丢失焦点后依然高亮 SelectedNode

带有 ExtendedSelection 的 Qml TreeView 中的 selectedRows() 落后了一步