代码之家  ›  专栏  ›  技术社区  ›  Mark Glorie

组织结构图树视图条件格式

  •  2
  • Mark Glorie  · 技术社区  · 16 年前

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

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

    正如你所看到的,它不是对称的,杰克、金姆和露西向爱丽丝汇报,但没有他们自己的报道。

    使用A TreeView 用一个 ItemsPanel 包含一个 StackPanel Orientation="Horizontal" easy enough 但这会导致 树视图 一旦有20个人向他们汇报!你可以 also use Triggers 窥探 TreeViewItem 有孩子和 Property="TreeViewItem.HasItems" ,但这与前面提到的上下文不同 iTimeSpell . 我可以说弗雷德有报告,但不知道他们是否有自己的报告。

    那么,你能有条件地格式化吗? TreeViewItems 如果他们没有自己的孩子,是垂直的吗?

    2 回复  |  直到 16 年前
        1
  •  2
  •   rudigrobler    16 年前

    乔什·史密斯有一篇关于TreeView的代码项目文章。读它 here

        2
  •  0
  •   Mark Glorie    16 年前

    最后我确实使用了链接文章中的提示,我已经通读过了,但认为这对我没有帮助。

    它的肉发生在这里,在一个转换器中:

    <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
    

    然后以我为树视图创建的样式使用:

        <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>