公司拥有传统的复杂组织结构,使用字母'n'而不是实际数字来定义级别数量。我将尝试用单声道字体表达我想要实现的结构:
Alice
,--------|-------,------,------,
Bob Fred Jack Kim Lucy
| |
Charlie Greg
Darren Henry
Eric
正如你所看到的那样,它不是对称的,正如杰克,金和露西向爱丽丝报告但没有自己的报道。
TreeView
ItemsPanel
StackPanel
Orientation="Horizontal"
TreeView
Triggers
TreeViewItem
Property="TreeViewItem.HasItems"
ItemsPanel
TreeViewItems
有些人有20个人报告给他们!您可以easy enough {{1}}查看{{1}}是否有{{1}}的孩子,但这与前面提到的{{1}}不在同一个上下文中。 例如:我可以告诉Fred有报告,但不知道他们是否有自己的报告。
那么,如果他们没有自己的孩子,你能有条件地将{{1}}格式化为垂直吗?
答案 0 :(得分:2)
Josh Smith有一篇关于TreeView的优秀CodeProject文章。阅读here
答案 1 :(得分:0)
我最终使用了链接文章中的提示,我已经阅读了这些提示,但我认为这对我没有帮助。
它的内容发生在这里,在转换器中:
<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
反过来,我在为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>