Question

La société possède la structure organisationnelle complexe traditionnelle, définissant le nombre de niveaux à l'aide de la lettre "n" plutôt que d'un nombre réel. Je vais essayer d’exprimer la structure que j’essaie de réaliser en caractères mono-espacés:

         Alice
 ,--------|-------,------,------,
Bob      Fred    Jack   Kim    Lucy
 |        |      
Charlie  Greg    
Darren   Henry
Eric

Comme vous pouvez le constater, ce n'est pas symétrique, puisque Jack, Kim et Lucy rendent compte à Alice mais n'en ont aucun rapport.

Utilisation d'un TreeView avec un ItemsPanel contenant un StackPanel et Orientation = "Horizontal" & <; code> est assez simple , mais cela peut générer un très grand TreeView une fois, certaines personnes en ont 20 autres! Vous pouvez également utiliser des déclencheurs pour déterminer si un TreeViewItem a des enfants avec Property = "TreeViewItem.HasItems" , mais ce n'est pas dans le même contexte que le ItemsPanel mentionné précédemment. Exemple: je peux dire que Fred a des rapports, mais pas s'ils ont eux-mêmes des rapports.

Alors, pouvez-vous conditionner de manière conditionnelle TreeViewItems pour qu'il soit Vertical s'il n'a aucun enfant?

Était-ce utile?

La solution 2

J'ai fini par utiliser les conseils de l'article lié, que j'avais déjà lus mais que je ne pensais pas pouvoir m'aider.

La viande de ça se passe ici, dans un convertisseur:

<ValueConversion(GetType(ItemsPresenter), GetType(Orientation))> _
Public Class ItemsPanelOrientationConverter
Implements IValueConverter

Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, _
ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) _
As Object Implements System.Windows.Data.IValueConverter.Convert

    'The 'value' argument should reference an ItemsPresenter.'
    Dim itemsPresenter As ItemsPresenter = TryCast(value, ItemsPresenter)
    If itemsPresenter Is Nothing Then
        Return Binding.DoNothing
    End If

    'The ItemsPresenter''s templated parent should be a TreeViewItem.'
    Dim item As TreeViewItem = TryCast(itemsPresenter.TemplatedParent, TreeViewItem)
    If item Is Nothing Then
        Return Binding.DoNothing
    End If

    For Each i As Object In item.Items
        Dim element As StaffMember = TryCast(i, StaffMember)
        If element.IsManager Then
            'If this element has children, then return Horizontal'
            Return Orientation.Horizontal
        End If
    Next

    'Must be a stub ItemPresenter'
    Return Orientation.Vertical

End Function

Ce qui se consomme à son tour dans un style que j'ai créé pour TreeView:

    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate >
                <ItemsPanelTemplate.Resources>
                    <local:ItemsPanelOrientationConverter x:Key="conv" />
                </ItemsPanelTemplate.Resources>
                <StackPanel IsItemsHost="True" 
                            Orientation="{Binding   
                            RelativeSource={x:Static RelativeSource.TemplatedParent}, 
                            Converter={StaticResource conv}}" />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>

Autres conseils

Josh Smith a un excellent article CodeProject sur TreeView. Lisez-le ici

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top