WPF: mise en forme conditionnelle TreeView organigramme
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?
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
.