2011-08-10 7 views
2

Je suis en train de créer un modèle pour un treeView dans WPF et C#. Mon problème est que je veux appliquer un modèle différent pour chaque niveau d'éléments. Je veux dire que le premier niveau d'objet sera différent des objets de second niveau. Je ne sais pas comment faire cela avec les gabarits et la reliure, car je suis nouveau dans la technologie. J'essaye également d'ajouter des boutons à un certain niveau treeviewItems ainsi je peux tirer des événements ou des commandes ... je sais que c'est beaucoup à demander, mais j'espère que quelqu'un me donnera une idée à ce sujet ou au moins si elle est possible ou non. Merci.Modèle personnalisé TreeView multiniveaux avec des boutons

+0

@ Ziad: Cela est possible. Chaque TreeNode est un conteneur et vous pouvez y ajouter vos contrôles personnalisés. – CharithJ

+0

c'est possible! [Cliquez ici!] (Http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=tree+view+wpf+codeproject) – stukselbax

+0

Merci les gars. Tu m'as vraiment aidé. J'ai une meilleure compréhension maintenant !!! –

Répondre

1

En supposant que tous les objets sont du même type, je peux voir deux méthodes pour y parvenir: utiliser les propriétés ItemTemplate ou ItemTemplateSelector.

Personnellement, je préfère l'approche XAML qui serait d'utiliser la propriété ItemTemplate.

Dans le modèle, vous devez spécifier des déclencheurs pour modifier l'apparence en fonction du niveau auquel l'élément est installé. Pour obtenir ce niveau, vous pouvez spécifier un convertisseur semblable à ceci:

public class TreeViewItemToLevelConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (!(value is DependencyObject)) 
      return 0; 

     return findLevel(value as DependencyObject, -1); 
    } 

    private int findLevel(DependencyObject tvi, int level) 
    { 
     DependencyObject tv = ItemsControl.ItemsControlFromItemContainer(tvi) as DependencyObject; 

     if (tv != null) 
      return findLevel(tv, level + 1); 
     else 
      return level; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new Exception("The method or operation is not implemented."); 
    } 
} 
+0

Mon vote ici. Je voudrais ajouter que vous devriez établir ce que vous entendez par «niveau». Est-ce le niveau visuel, ou un niveau logique? En tant que «niveau logique», je veux dire l'importance logique de l'élément affiché, ne correspondant pas nécessairement à la hiérarchie visuelle. Si c'est le cas, je suggère de fournir une propriété "Niveau" dédié dans votre modèle, au lieu de calculer un "gras" montré. Cependant, pour un visuel, l'extrait "gras" est correct. –

Questions connexes