Получить FullPath в дереве WPF? - PullRequest
4 голосов
/ 30 ноября 2010

Если я создаю 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);

Однако я хотел бы получить путь к определенному узлу в древовидном представлении, очень похожему на свойство FullPath в классе System.Windows.Forms.TreeNode. Таким образом, путь для subNode2 будет RootNode//SubNode2. Как мне это сделать?

Редактировать: я не ищу ручного решения, однако мне интересно, есть ли эквивалентный метод доступа, такой как FullPath, или я собираюсь использовать класс TreeF WPF неправильно. Например. Я посмотрел на DisplayMemberPath и SelectedValuePath, но, похоже, они не дают результата, которого я добиваюсь.

Ответы [ 2 ]

6 голосов
/ 30 ноября 2010

Посмотрите мой ответ здесь:

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;
}
3 голосов
/ 30 ноября 2010

См. Ниже код.

Таким образом, эта функция возвращает стек, в котором самый верхний элемент будет корневым, а последний элемент будет непосредственным родителем элемента.

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...