2010-11-30 15 views
4

Wenn ich eine WPF TreeView programmatisch erstellen, zum Beispiel:Get FullPath in WPF-Strukturansicht?

// 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); 

Allerdings würde Ich mag den Weg zu einem bestimmten Knoten in der Baumansicht erhalten ähnlich wie die FullPath Eigenschaft in der System.Windows.Forms.TreeNode Klasse. Der Pfad für subNode2 wäre also RootNode//SubNode2. Wie mache ich das?

Edit: Ich bin nicht auf der Suche nach der manuellen Lösung, aber ich frage mich, ob es einen entsprechenden Accessor wie FullPath oder wenn ich über die Verwendung der WPF TreeView Klasse in die falsche Richtung gehen. Z.B. Ich habe mir DisplayMemberPath und SelectedValuePath angesehen, aber sie scheinen nicht das Ergebnis zu liefern, nach dem ich bin.

Antwort

6

Werfen Sie einen Blick in meine Antwort hier:

Silverlight: Determine parent TreeViewItem?

Bestimmen Weg dann ist einfach:

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

Code unten sehen.

Diese Funktion gibt also einen Stapel zurück, in dem der oberste Eintrag root ist und der letzte Eintrag der unmittelbare Elternteil des Elements ist.

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<TreeViewItem> GetNodeParent(UIElement element) 
    { 
     Stack<TreeViewItem> tempNodePath = new Stack<TreeViewItem>(); 
     // 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<object> e) 
    { 
     Stack<TreeViewItem> path = GetNodeParent(e.NewValue as UIElement); 
    } 
}