Установить SelectionActive в TreeViewItem WPF - PullRequest
3 голосов
/ 11 января 2012

Как сделать TreeViewItem активным?Я могу сделать это только с помощью этого кода:

treeViewItem.IsSelected = true;

Я пытался сделать это:

treeViewItem.Focus()

Но это не работает

Как сделать этот TreeViewItem активным иВыделено?

Вот код моего дерева.

foreach(MyData dt in rootdata)
{
   TreeViewItem root = new TreeViewItem()
   root.IsExpanded = true;
   root.Header = dt .DataHeader;
   treeView.Items.Add(root);

   foreach(AnotherData dat in parentData)
   {
       TreeViewItem parent = new TreeViewItem()
       parent .IsExpanded = true;
       parent .Header = dat .DataHeader;
       root.Items.Add(parent);    

       foreach(AnotherData dat in childData)
       {
          TreeViewItem Child = new TreeViewItem()
          Child.IsExpanded = true;
          Child.Header = dat.DataHeader;


          if(this treeViewItem should be selected) 
          {
              child.IsSelected = true;
              child.Focus();
          }
           parent.Items.Add(Child);  
       }
   }
}

1 Ответ

2 голосов
/ 11 января 2012

Это зависит. Как получить объект TreeViewItem, как выглядит дерево (иерархия) и как оно заполняется? Это привязки данных и виден ли ваш treeViewItem (не внутри свернутого элемента)?

Это код, который я использовал для выбора и расширения данного узла XML.

private void SetSelected(XmlNode node)
{
    Stack<XmlNode> path = new Stack<XmlNode>();

    XmlDataProvider dp = FindResource("xml") as XmlDataProvider;
    XmlNode root = dp.Document.LastChild;

    XmlNode n1 = node;

    //path.Push(node);
    while (n1.ParentNode != root)
    {
        n1 = n1.ParentNode;
        if (n1 == null)
            return;
        path.Push(n1);
    }
    path.Push(root);

    ItemsControl control = tree;
    foreach (XmlNode n in path)
    {

        TreeViewItem tviItem = control.ItemContainerGenerator.ContainerFromItem(n) as TreeViewItem;
        tviItem.IsExpanded = true;
        tviItem.UpdateLayout();
        control = tviItem;
    }

    TreeViewItem resultItem = control.ItemContainerGenerator.ContainerFromItem(node) as TreeViewItem;
    resultItem.IsSelected = true;
    resultItem.Focus();
}

XAML:

<XmlDataProvider x:Key="xml"/> 
<TreeView ItemsSource="{Binding Source={StaticResource xml}}" x:Name=tree/>

Этот код сначала выполняет поиск пути к корню от выбранного узла. (Если у вас есть TreeViewItem вместо XmlNode или любой другой объект, это также работает, за исключением того, что вы используете item.Parent вместо n1.ParentNode)

Затем он идет от корня, расширяет все узлы и обновляет макет (важно).

Наконец, выбранный узел устанавливается как IsSelected = true и получает фокус.

...