2014-10-29 71 views
1

我想被選定爲樹型視圖獲取選定節點的父樹型視圖在WPF

我有2場Person類節點的父。名稱(字符串)和兒童(字符串列表)

這是我的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++; 
    } 
} 

在else部分中,child.Parent總是返回null。我嘗試了其他方法,但沒有一個返回TreeViewItem,而是返回DependencyObjectItemsControl

我也試過ContainerFromItem方法,但它只適用於直接的孩子(父母)而不是父母的孩子。

請幫

+0

通過WPF導航用戶界面有時非常棘手。如果您找不到實現此目的的方法,只需在您的Person類中添加一個Parent,使導航變得更加簡單。 – Bijan 2014-10-29 09:11:33

回答

0

ItemsSource通常是的,你可以綁定到DependencyObject個集合。它不反映關於用戶界面的任何信息。你正在尋找的是每個項目的ItemContainer,它是WPF UI的一部分。

在大多數情況下,您可以從另一個訪問UIElement而沒有任何問題。但根據我的經驗,隨着UI由於樣式,模板和分層項目而變得複雜,一些UIElements將很難找到。

我建議通過以下方式:

與類型的人實現您的視圖模型(Person類)Parent屬性和人的構造函數初始化它,然後你就可以同時獲得父人事和家長的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