在WPF树视图中获取FullPath?

如果我以编程方式创建WPF TreeView,例如:

// TreeView treeView; <- added in the designer TreeViewItem rootNode = new TreeViewItem(); rootNode.Header = "RootNode" treeView.Items.Add(rootNode); TreeViewItem subNode1 = new TreeViewItem(); subNode1.Header = "SubNode1"; rootNode.Items.Add(subNode1); TreeViewItem subNode2 = new TreeViewItem(); subNode2.Header = "SubNode2"; rootNode.Items.Add(subNode2); 

但是,我想获取树视图中某个节点的路径,就像System.Windows.Forms.TreeNode类中的FullPath属性一样。 所以subNode2的路径是RootNode//SubNode2 。 我该怎么做呢?

编辑:我不是在寻找手动解决方案,但是我想知道是否有像FullPath这样的等效访问FullPath或者我是否会以错误的方式使用WPF TreeView类。 例如。 我查看了DisplayMemberPathSelectedValuePath但它们似乎没有提供我所追求的结果。

看看我的回答:

Silverlight:确定父TreeViewItem?

确定路径然后很简单:

 public string GetFullPath(TreeViewItem node) { if (node == null) throw new ArgumentNullException(); var result = Convert.ToString(node.Header); for (var i = GetParentItem(node); i != null; i = GetParentItem(i)) result = i.Header + "\\" + result; return result; } 

见下面的代码。

所以这个函数返回一个堆栈,其中最顶层的项目将是root,最后一个项目将是element的直接父项。

 public partial class Window1 : Window { public Window1() { InitializeComponent(); TreeViewItem rootNode = new TreeViewItem(); rootNode.Header = "RootNode"; treeView.Items.Add(rootNode); TreeViewItem subNode1 = new TreeViewItem(); subNode1.Header = "SubNode1"; rootNode.Items.Add(subNode1); TreeViewItem subNode2 = new TreeViewItem(); subNode2.Header = "SubNode2"; rootNode.Items.Add(subNode2); TreeViewItem subNode3 = new TreeViewItem(); subNode3.Header = "SubNode3"; subNode2.Items.Add(subNode3); } public static Stack GetNodeParent(UIElement element) { Stack tempNodePath = new Stack(); // Walk up the element tree to the nearest tree view item. TreeViewItem container = element as TreeViewItem; while ((element != null)) { element = VisualTreeHelper.GetParent(element) as UIElement; container = element as TreeViewItem; if(container!=null) tempNodePath.Push(container); } return tempNodePath; } private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs e) { Stack path = GetNodeParent(e.NewValue as UIElement); } }