WPF:مخطط هيكلي TreeView التنسيق الشرطي
سؤال
وكانت الشركة قد التقليدية المعقدة الهيكل التنظيمي وتحديد كمية من المستويات باستخدام حرف '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
لم ينتهي باستخدام نصائح من ربط المادة التي كنت بالفعل من خلال قراءة ولكن لا أعتقد أن تساعد لي.
لحوم يحدث هنا في converter:
<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>
نصائح أخرى
جوش سميث لديه excecllent CodeProject المادة عن TreeView.قراءتها هنا