2

该公司具有传统的复杂组织结构,使用字母“n”而不是实际数字来定义级别的数量。我将尝试用等距字体表达我想要实现的结构:

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

如您所见,它不是对称的,因为 Jack、Kim 和 Lucy 向 Alice 报告,但没有他们自己的报告。

使用包含 a和TreeView的a很容易,但是一旦有些人有 20 个其他人向他们报告,这可能会导致非常大!您也可以使用来查看 a 是否有子级 ,但这与前面提到的上下文不同。例如:我可以说 Fred 有报告,但不知道他们是否有自己的报告。ItemsPanelStackPanelOrientation="Horizontal"TreeView TriggersTreeViewItemProperty="TreeViewItem.HasItems"ItemsPanel

TreeViewItems那么,如果他们没有自己的孩子,你可以有条件地格式化为 Vertical 吗?

4

2 回答 2

2

Josh Smith 有一篇关于 TreeView 的优秀 CodeProject 文章。在这里阅读

于 2008-09-16T07:00:48.450 回答
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>
于 2008-09-22T04:04:00.560 回答