2013-07-03 2 views
0

Как мне взять список, а затем в группе TreeView их по классу? Я читал this, но он не группирует дочерние объекты, вместо этого он имеет связанные свойства в коллекциях.Как сгруппировать дочерние объекты из одного списка в TreeView?

  • Склад
    • Тип A
      • Подтип 1
      • Подтип 2
    • Тип B
    • Тип C

Если у меня есть список, у которого есть все те типы, как я могу показать группировку в 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
  • т.д.

ответ

0

Group ваша коллекция, установив GroupDescriptions на его CollectionViewSource. Вы можете сделать это в коде, делая что-то вроде этого:

CollectionViewSource.GetDefaultView(yourCollection).GroupDescriptions.Add(
new PropertyGroupDescription("PropertyName")); 

Или вы можете сделать это в XAML, создавая CollectionViewSource явно.

<CollectionViewSource 
    Source="{StaticResource yourCollection}" 
    xmlns:dat="clr-namespace:System.Windows.Data;assembly=PresentationFramework"> 
    <CollectionViewSource.GroupDescriptions> 
     <dat:PropertyGroupDescription PropertyName="PropertyName"/> 
    </CollectionViewSource.GroupDescriptions> 
</CollectionViewSource> 

Также проверить это enter link description here

+0

что группы с помощью 'Property', а не самого типа объекта. –

Смежные вопросы