WPF:组织结构图TreeView条件格式
时间:2020-03-05 18:55:18 来源:igfitidea点击:
该公司具有传统的复杂组织结构,使用字母" n"而不是实际数字来定义级别的数量。我将尝试以等间距字体表示要实现的结构:
Alice ,--------|-------,------,------, Bob Fred Hyman Kim Lucy | | Charlie Greg Darren Henry Eric
如我们所见,它不是对称的,就像Hyman,金和露西向爱丽丝报告,但没有他们自己的报告。
将TreeView和包含包含StackPanel和Orientation =" Horizontal"的ItemsPanel一起使用很容易,但是一旦有人20个人向他们报告,这可能会导致TreeView非常大!我们也可以使用Triggers来查看TreeViewItem是否具有带有Property =" TreeViewItem.HasItems"的子级,但这与前面提到的ItemsPanel不在同一个上下文中。例如:我可以说弗雷德有报告,但没有告诉他们是否有自己的报告。
因此,如果它们没有自己的子级,我们可以有条件地将" TreeViewItems"格式化为"垂直"吗?
解决方案
回答
Josh Smith在CodeProject上有一篇关于TreeView的精彩文章。在这里阅读
回答
最后,我确实使用了链接文章中的技巧,尽管我已经阅读了这些技巧,但认为不会帮助我。
它的实质在这里发生在转换器中:
<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>