2012-01-11 4 views
2

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

treeViewItem.IsSelected = true; 

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

treeViewItem.Focus() 

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

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

Вот код моего TreeView:

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); 
     } 
    } 
} 
+0

Вы уверены, что получаете звонок на «treeViewItem.IsSelected»? – Rohit

+0

Да, я установил триггер для IsSelectionActive в Xaml, я вижу, был ли этот элемент выбран или активен. –

ответ

1

Это зависит от многого. Как вы получаете свой объект 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 и заданный фокус.

+0

My treeView расширен, и я создаю свой TreeViewItem следующим образом: TreeViewItem item = new TreeViewItem(); –

+0

Как вы заполняете дерево? – AkselK

+0

Я сделал редактирование в своем коде, см. Там мой treeView –

Смежные вопросы