WPF: Organigramm TreeView Bedingte Formatierung
Frage
Das Unternehmen verfügt über die traditionelle komplexe Organisationsstruktur, definiert die Höhe der Stufen die Buchstaben ‚n‘ und nicht eine tatsächliche Nummer. Ich werde versuchen, und drücke die Struktur Ich versuche, in Mono-Abstand Schriftart zu erreichen:
Alice
,--------|-------,------,------,
Bob Fred Jack Kim Lucy
| |
Charlie Greg
Darren Henry
Eric
Wie Sie sehen können es nicht symmetrisch ist, wie Jack, Kim und Lucy Bericht zu Alice, haben aber keine Berichte über ihre eigenen.
Mit einem TreeView
mit einem ItemsPanel
ein StackPanel
und Orientation="Horizontal"
enthält, ist einfach genug , aber dies kann in einem sehr großen TreeView
führen, wenn einige Leute sie berichten 20 andere haben! Sie können auch Triggers
verwenden, um in spähen, ob ein TreeViewItem
Kinder mit Property="TreeViewItem.HasItems"
hat, aber das ist nicht im gleichen Kontext wie die zuvor genannten ItemsPanel
. . ZB: Ich kann sagen, dass Fred Berichte, aber nicht, ob sie Berichte über ihre eigenen haben
So können Sie bedingt Format TreeViewItems
Vertikale sein, wenn sie keine eigenen Kinder haben?
Lösung 2
habe ich mit Tipps aus dem verlinkten Artikel am Ende, was ich schon durch gelesen habe, aber hätte nicht gedacht, würde mir helfen.
Das Fleisch kommt es hier, in einem Konverter:
<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
Was wiederum in einem Stil verbraucht wird ich für das TreeView erstellt:
<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>
Andere Tipps
Josh Smith hat einen excecllent Codeproject Artikel über TreeView. Lesen Sie es hier