2014-10-29 2 views
1

Я хочу, чтобы родительский узел, который выбран в качестве TreeViewItemПолучить родительский TreeViewItem выбранного узла в WPF

У меня есть класс Person с 2 полями. Имя (String) и дети (Список строки)

Это мой XAML код

<Grid x:Name="gridView" Margin="10"> 
    <TreeView Name="treeView1" TreeViewItem.Selected="TreeViewItem_OnItemSelected" ItemsSource="{Binding}"> 
     <TreeView.ItemContainerStyle> 
      <Style TargetType="{x:Type TreeViewItem}"> 
       <Setter Property="IsSelected" Value="{Binding IsSelected, Source=Check, Mode=TwoWay}" /> 
      </Style> 
     </TreeView.ItemContainerStyle> 
     <TreeView.Resources> 
      <HierarchicalDataTemplate DataType="{x:Type loc:Person}" ItemsSource="{Binding Children}" > 
       <TextBlock Text="{Binding Name}" /> 
      </HierarchicalDataTemplate> 
     </TreeView.Resources> 
    </TreeView> 
</Grid> 

это мой код позади. Я установил источник элемента в список объектов Person.

void set() 
{ 
    if (treeView1.Items.IndexOf(treeView1.SelectedItem) != -1) 
    { 
     //is a parent 
     //returns -1 for children 
     Person selected = (Person)treeView1.SelectedItem; 
     int index = search(selected); 
     TreeViewItem parent = treeView1.Tag as TreeViewItem; 
     setSelected(parent,index); 
    } 
    else 
    { 
     //is a child 
     TreeViewItem child = treeView1.Tag as TreeViewItem; //returns the selected node 
     TreeViewItem parent = child.Parent as TreeViewItem; //returns null 
    } 
} 
private void TreeViewItem_OnItemSelected(object sender, RoutedEventArgs e) 
{ 
    treeView1.Tag = e.OriginalSource; 
    int ind = 0; 
    foreach (var _item in treeView1.Items) 
    { 
     if (_item == treeView1.SelectedItem) 
     { 
      selectedIndex = ind; 
      break; 
     } 
     ind++; 
    } 
} 

В остальной части child.Parent всегда возвращает null. Я пробовал другие методы, но ни один из них не возвращал TreeViewItem, вместо этого они возвращали DependencyObject или ItemsControl.

Я также пробовал метод ContainerFromItem, но он работает только для прямых детей (родителей), а не для детей родителя.

Пожалуйста, помогите

+0

Перемещение по WPF Пользовательский интерфейс иногда очень сложный. Если вы не смогли найти способ достичь этого, просто попробуйте добавить родителя в свой класс Person, который значительно упрощает навигацию. – Bijan

ответ

0

ItemsSource обычно представляет собой совокупность DependencyObject с которой можно привязать. Он не отражает никакой информации об пользовательском интерфейсе. То, что вы ищете, на самом деле является ItemContainer каждого элемента, который является частью интерфейса WPF.

В большинстве случаев вы можете получить доступ к UIElement от другого без каких-либо проблем. Но по моему опыту, когда пользовательский интерфейс усложняется стилями, шаблонами и иерархическими элементами, некоторые UIElements будут трудно найти.

Я предлагаю следующим образом:

Реализовать свойство Parent в вашей ViewModel (Person класс) с типом лица и инициализировать его в конструкторе человека, то вы можете получить как родительский Человек и родительский TreeViewItem как это:

var parentPerson = (treeView1.SelectedItem as Person).Parent; 
var parentNode = treeView1.ItemContainerGenerator.ContainerFromItem(parentPerson); 
1

Вы можете использовать VisualTreeHelper.GetParent() метод: https://msdn.microsoft.com/de-de/library/system.windows.media.visualtreehelper.getparent(v=vs.110).aspx

Пример кода:

private TreeViewItem FindParentTreeViewItem(object child) 
{ 
    try 
    { 
     var parent = VisualTreeHelper.GetParent(child as DependencyObject); 
     while ((parent as TreeViewItem) == null) 
     { 
      parent = VisualTreeHelper.GetParent(parent); 
     } 
     return parent as TreeViewItem; 
    } 
    catch (Exception e) 
    { 
     //could not find a parent of type TreeViewItem 
     return null; 
    } 
} 

в то время как цикл необходим, так как визуальный родитель элемента просмотра дерева не является его родительский элемент в виде дерева, как можно видеть в этом WPF дерева визуализатора:

WPF Tree Visualizer showing tree view

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