2015-07-15 1 views
0

J'ai une classe TreeView comme si, qui a ma propre classe « EntryPanel » comme ItemTemplate:Comment obtenir TreeView à partir de la classe ItemTemplate?

<TreeView x:Class="PowerNote.MyEntriesView"    
     xmlns:local="clr-namespace:PowerNote" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}" 
     ItemsSource = "{Binding viewStudents}"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
      <local:EntryPanel/> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

Dans mon code EntryPanel.xaml.cs, je voudrais accéder au TreeView. J'ai essayé Parent et TemplateParent, mais aucun ne fonctionnerait. Comment puis-je atteindre cet objectif?

Répondre

0

Essayez de faire de cette manière pour trouver le parent.

public static T TryFindParent<T>(this DependencyObject child) 
where T : DependencyObject 
{ 
    //get parent item 
    DependencyObject parentObject = GetParentObject(child); 

    //we've reached the end of the tree 
    if (parentObject == null) return null; 

    //check if the parent matches the type we're looking for 
    T parent = parentObject as T; 
    if (parent != null) 
    { 
     return parent; 
    } 
    else 
    { 
    //use recursion to proceed with next level 
    return TryFindParent<T>(parentObject); 
    } 
} 

Celui-ci trouvera l'objet parent.

public static DependencyObject GetParentObject(this DependencyObject child) 
{ 
    if (child == null) return null; 

    //handle content elements separately 
    ContentElement contentElement = child as ContentElement; 
    if (contentElement != null) 
    { 
     DependencyObject parent = ContentOperations.GetParent(contentElement); 
     if (parent != null) return parent; 

     FrameworkContentElement fce = contentElement as FrameworkContentElement; 
     return fce != null ? fce.Parent : null; 
    } 

    //also try searching for parent in framework elements (such as DockPanel, etc) 
    FrameworkElement frameworkElement = child as FrameworkElement; 
    if (frameworkElement != null) 
    { 
     DependencyObject parent = frameworkElement.Parent; 
     if (parent != null) return parent; 
    } 

    //if it's not a ContentElement/FrameworkElement, rely on VisualTreeHelper 
    return VisualTreeHelper.GetParent(child); 
} 

Cet extrait fonctionne avec des objets de dépendance arbitraires de type Visual ou Visual3D. Alors disons que vous avez besoin d'une référence à la fenêtre qui héberge un ce quelque part contrôle Button donné, tout ce que vous avez besoin est:

Button myButton = ... 
Window parentWindow = UIHelper.TryFindParent<Window>(myButton); 

La méthode TryFindParent ci-dessus permet également facile d'obtenir un élément à une position donnée. La méthode ci-dessous effectue un test de réussite basé sur une position donnée. Si le test de validation ne renvoie pas l'élément demandé (par exemple, un CheckBox cliqué sur un arbre, alors que vous êtes intéressé par le TreeViewItem qui héberge le CheckBox), la procédure délègue la recherche à TryFindParent.

Cela est très pratique pour les événements liés à la souris si vous avez juste besoin maintenant ce qui est sous le pointeur de la souris:

public static T TryFindFromPoint<T>(UIElement reference, Point point) 
    where T:DependencyObject 
    { 
    DependencyObject element = reference.InputHitTest(point) 
          as DependencyObject; 
    if (element == null) return null; 
    else if (element is T) return (T)element; 
    else return TryFindParent<T>(element); 
    } 

Reference

+0

Bien que ce lien peut répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. –

+0

@NathanTuggy Oui, vous avez raison. Je ne suis pas sûr que cela a aidé le PO mais je publie tout de même le contenu du lien ici. Merci pour les mains levées. –