获取TreeView中所选项的TreeViewItem

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

XAML: –

      

  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; } } 

尝试

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

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

数据绑定到WPF Treeview中的SelectedItem

从TreeView获取SelectedItem?

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

虽然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); 

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

处理TreeViewItem.Selected

  

并将TreeViewItem设置为标记。

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

您可以稍后检索

 TreeViewItem tvi = mTreeView.Tag as TreeViewItem; 

我发现的最佳解决方案涉及一个简单的辅助方法,几乎​​可以用于任何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; }