2015-03-12 10 views
6

Capisco che la programmazione in C# con WPF sia diversa dalle procedure C# tradizionali, quindi la maggior parte del materiale online non indica ciò di cui ho bisogno.Ottieni il nodo padre di un figlio in WPF C# TreeView

Ho un controllo TreeView nella mia finestra WPF e ho nodi padre e nodi figlio in esso. Vorrei memorizzarli in un elenco di tipo Node (id, name, parent).

enter image description here

Ho preso il nome della voce/node selezionati tramite questo:

private void TreeViewItem_OnItemSelected(object sender, RoutedEventArgs e) 
{ 
    TreeViewItem item = treeView.SelectedItem as TreeViewItem; 
    nameTxt.Text = item.Header.ToString(); 
} 

e ho provato ricevendo il capogruppo del nodo figlio immediatamente prima di utilizzare questo:

TreeViewItem item = treeView.SelectedItem as TreeViewItem; 
nameTxt.Text = item.Parent.ToString(); 

Tuttavia, restituisce il padre principale (A) anziché il genitore del figlio (che è 2).

Quali modifiche devo apportare per ottenere il genitore immediato del bambino invece del genitore root? :)

EDIT: Ecco il codice XAML

<TreeView Name="treeView" HorizontalAlignment="Left" Height="564" Margin="10,68,0,0" VerticalAlignment="Top" Width="363"> 
    <TreeViewItem TreeViewItem.Selected="TreeViewItem_OnItemSelected" Header="A" IsExpanded="True" Height="554" FontSize="18"> 
       <TreeViewItem Header="1" /> 
       <TreeViewItem Header="2" /> 
    </TreeViewItem> 
</TreeView> 
+0

È insolito che sia il genitore del nodo restituito dalla proprietà Parent. Potresti mostrare una versione estesa del codice che hai fornito, forse il problema è altrove – Hristo

+0

Che cosa era il "SelectedItem" quando "item.Parent"? 'restituisce' A'? –

+0

@Chris questo è il codice completo, amico. Sto solo stampando l'elemento selezionato e il genitore in una casella di testo. Continua a mappare sul nodo radice che è A. Tuttavia l'elemento selezionato mostra l'elemento attualmente selezionato, è solo che il genitore continua ad essere mappato sul nodo radice invece del genitore immediatamente prima di – MWUser

risposta

13

Creato un piccolo esempio per dimostrare il problema

In MainWindow.xaml

<TreeView Name="tree"> 
    <TreeView> 
     <TreeViewItem Header="North America" Selected="TreeViewItem_OnItemSelected"> 
      <TreeViewItem Header="USA"> 
       <TreeViewItem Header="New York"/> 
       <TreeViewItem Header="Las Vegas"/> 
       <TreeViewItem Header="Washington"/> 
      </TreeViewItem> 
      <TreeViewItem Header="Canada"> 
       <TreeViewItem Header="Toronto"/> 
       <TreeViewItem Header="Quebec"/> 
       <TreeViewItem Header="Montreal"/> 
      </TreeViewItem> 
      <TreeViewItem Header="Mexico"></TreeViewItem> 
     </TreeViewItem> 
    </TreeView> 
</TreeView> 

in codice dietro a IE MainWindow. xaml.cs

private void TreeViewItem_OnItemSelected(object sender, RoutedEventArgs e) 
    { 
     TreeViewItem item = e.OriginalSource as TreeViewItem; 
     if (item != null) 
     { 
      ItemsControl parent = GetSelectedTreeViewItemParent(item); 

      TreeViewItem treeitem = parent as TreeViewItem; 
      string MyValue= treeitem .Header.ToString();//Gets you the immediate parent 
     } 
    } 
    public ItemsControl GetSelectedTreeViewItemParent(TreeViewItem item) 
    { 
     DependencyObject parent = VisualTreeHelper.GetParent(item); 
     while (!(parent is TreeViewItem || parent is TreeView)) 
     { 
      parent = VisualTreeHelper.GetParent(parent); 
     } 

     return parent as ItemsControl; 
    } 

E il suo fatto.

+0

Genio! Questo ha funzionato amico! Grazie mille per aver dedicato del tempo a organizzare una dimostrazione. Ti auguro una buona giornata! – MWUser

Problemi correlati