Как мне взять список, а затем в группе TreeView их по классу? Я читал this, но он не группирует дочерние объекты, вместо этого он имеет связанные свойства в коллекциях.Как сгруппировать дочерние объекты из одного списка в TreeView?
- Склад
- Тип A
- Подтип 1
- Подтип 2
- Тип B
- Тип C
- Тип A
Если у меня есть список, у которого есть все те типы, как я могу показать группировку в TreeView?
До этого я вручную добавлял их в один TreeViewItem за раз.
List<Warehouse> myWarehouse = new List<Warehouse>();
TreeViewItem WarehouseNode = new TreeViewItem() { Header = "Warehouse" };
TreeViewItem TypeANode = new TreeViewItem() { Header = "Type A" };
foreach(SubtypeA type in myWarehouse) {
TypeANode.Items.Add(new TreeViewItem() { Header = type.Name };
}
WarehouseNode.Items.Add(TypeANode);
etc. for Type B and Type C.
Я читал о HierarchicalDataTemplate и это выглядит так, как я хочу пойти, используя ItemTemplateSelector изменить DataTemplate.
Итак, я начал работать с HierarchicalDataTemplates
и придумал ниже.
XAML:
<Window.Resources>
<Utility:MyTemplateSelector x:Key="MyTemplateSelector" />
<HierarchicalDataTemplate x:Key="TypeCTemplate" DataType="{x:Type EntityType:TypeC}"
ItemsSource="{Binding OBJS}" ItemTemplateSelector="{StaticResource MyTemplateSelector}">
<TextBlock Text="Type C"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="TypeBTemplate" DataType="{x:Type EntityType:TypeB}"
ItemsSource="{Binding OBJS}" ItemTemplateSelector="{StaticResource MyTemplateSelector}">
<TextBlock Text="Type B"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate x:Key="TypeATemplate" DataType="{x:Type EntityType:TypeA}"
ItemsSource="{Binding OBJS}" ItemTemplateSelector="{StaticResource MyTemplateSelector}">
<TextBlock Text="Type A"/>
</HierarchicalDataTemplate>
</Window.Resources>
<Grid>
<TreeView Name="MyTreeView" ItemsSource="{Binding OBJS}"
ItemTemplateSelector="{StaticResource MyTemplateSelector}">
</TreeView>
</Grid>
Я написал DataTemplateSelector
:
class MyTemplateSelector : DataTemplateSelector {
public override DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) {
MethodInfo mi = container.GetType().GetMethod("FindResource") as MethodInfo;
if(mi != null) {
string strItem = item.ToString().Split('.').Last();
switch(item.ToString().Split('.').Last()) {
case "Type A":
return mi.Invoke(container, new object[] { "TypeATemplate" }) as DataTemplate;
case "Type B":
return mi.Invoke(container, new object[] { "TypeBTemplate" }) as DataTemplate;
case "Type C":
return mi.Invoke(container, new object[] { "TypeCTemplate" }) as DataTemplate;
}
return null;
}
return null;
}
}
Но теперь, когда я смотрю на TreeView, это дает мне это:
- Тип B
- Тип B
- Тип B
- Тип C
- т.д.
что группы с помощью 'Property', а не самого типа объекта. –