WPF: Org Chart TreeView Условное форматирование - PullRequest
2 голосов
/ 16 сентября 2008

Компания имеет традиционную сложную организационную структуру, определяющую количество уровней с использованием буквы «n», а не фактического числа. Я попытаюсь выразить структуру, которую я пытаюсь достичь, в моноширинном шрифте:

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

Как вы можете видеть, это не симметрично, поскольку Джек, Ким и Люси отчитываются перед Алисой, но не имеют собственных отчетов.

Использование TreeView с ItemsPanel, содержащим StackPanel и Orientation="Horizontal", достаточно просто , но это может привести к очень большому TreeView, если некоторые люди сообщают о 20 других им! Вы можете также использовать Triggers, чтобы узнать, есть ли у TreeViewItem дочерние элементы с Property="TreeViewItem.HasItems", но это не в том же контексте, что и вышеупомянутый ItemsPanel. Например: я могу сказать, что у Фреда есть отчеты, но нет ли у них собственных отчетов.

Итак, можете ли вы условно отформатировать TreeViewItems как вертикальное, если у них нет собственных детей?

Ответы [ 2 ]

2 голосов
/ 16 сентября 2008

У Джоша Смита есть замечательная статья CodeProject о TreeView. Прочитайте это здесь

0 голосов
/ 22 сентября 2008

В итоге я воспользовался советами из связанной статьи, которую я уже прочитал, но не думал, что она мне поможет.

Мясо этого происходит здесь, в конвертере:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...