2010-02-11 8 views
7

Estoy tratando de obtener mi vista de árbol para agrupar una colección de elementos similares por lo que son. Para mantener las cosas genérico, mi jerarquía de objetos podría tener este aspecto:Agrupando objetos secundarios en WPF TreeView

  • Objetos
    • objeto Grupo # 1
      • Artículo # 1 (Tipo 'A')
      • Artículo # 2 (Tipo 'A')
      • artículo # 3 (Tipo 'B')
      • artículo # 4 (Tipo 'B')

Ahora mismo mi TreeView muestra estos objetos exactamente igual que el modelo de objetos, pero lo que me gustaría hacer es insertar un nodo de TreeView para cada tipo de objeto para que se vería así:

  • objetos
    • objeto Grupo # 1
      • Tipo A
        • Artículo # 1
        • Artículo # 2
      • Tipo B
        • Artículo # 3
        • Artículo # 4

Vi en una pregunta similar aquí que alguien recomendaba tener dos HierarchicalDataTemplates por separado, así que creé uno para el nivel 'Grupo de Objetos # 1' que contiene un TreeView con una lista de los tipos, pero esto es realmente torpe ya que es TreeView completamente separado dentro de algunos nodos. También he estado tratando de usar un CollectionViewSource para filtrar los elementos en cada categoría, pero esto no me sirve de mucho, ya que no puedo encontrar la manera de mostrarlos.

Supongo que mi pregunta se reduce a esto: ¿cómo hago que un grupo HierarchicalDataTemplate sean niños? Si alguien pudiera señalarme en la dirección correcta, lo apreciaría mucho.

Puedo publicar un código si alguien quiere verlo, pero realmente solo estoy tratando de encontrar la forma de hacer lo que quiero, así que mi código es simplemente una vista de árbol de datos en línea bastante directa en este momento.

Respuesta

5

Eche un vistazo a this artículo del Sr. Sumi. Estoy seguro de que te ayudará.

+0

Esto es exactamente lo que necesitaba ver. Gracias. – aalex675

0

AFAIK, HierarchicalDataTemplate no se pueden agrupar sus hijos.

La vista solo debe mostrar lo que se obtenga, sin tener que profundizar en los tipos de objetos/grupos ... ¿Por qué no se crean estos grupos en el modelo de objetos?

Y la vista sólo se pondrá Smth como:

public interface ITreeNode 
{ 
    string Title; 
    IList<ITreeNode> ChildNodes; 
} 

y mostrarlo usando el HierarchicalDataTemplate.

7

Puede lograr este efecto vinculando ItemsSource en su HierarchicalDataTempalate usando IValueConverter. Este convertidor es simplemente hace lo siguiente:

public class MyConverter : IValueConverter 
{ 
    public object Convert(object value, ...) 
    { 
    return 
     from item in (IEnumerable<MyItem>)value 
     group item by item.Type into g 
     select new { Type = item.Type, Items = g }; 
    } 
    ... 
} 

Ahora su HierarchcialDataTemplate puede ser de la siguiente manera:

<HierarchicalDataTemplate ItemsSource="{Binding SomePath, Converter={x:Static local:MyConverter}"> 

    <HierarchicalDataTemplate.ItemTemplate> 
    <HierarchicalDataTemplate 
     ItemsSource="{Binding Items}" 
     TargetType="{x:Type local:MyItem}" 

     ItemTemplate="{StaticResource MyItemTemplate}"> 
     <!-- may omit ItemTemplate in prior line to use implicit template --> 

     <TextBlock Text="{Binding Type}" /> <!-- Header for type --> 

    </HierarchicalDataTemplate> 
    </HierarchicalDataTemplate.ItemTemplate> 

    <!-- header for "Object Group #1" --> 

</HierarchicalDataTemplate> 
+1

'select new {Type = item.Type, Items = g};' no compila; tal vez 'seleccione nuevo {Tipo = g.Primer(). Tipo, Elementos = g};'? – arolson101

+1

'select new {Type = g.Key, Items = g}' funciona – arolson101

0

Si esto es un simple método de agrupación de una colección plana para el propósito de pantalla que está buscando tal vez usar un "CollectionViewSource" será más adecuado. El uso de LINQ podría convertirse en una pesadilla debido a la propagación del evento Property/Collection Change.

<CollectionViewSource x:Key="GroupedItems" Source="{Binding ItemsSource, ElementName=My_UserControl}"> 
    <CollectionViewSource.GroupDescriptions> 
     <PropertyGroupDescription PropertyName="Type" Converter="{StaticResource GroupingConverter}" /> 
    </CollectionViewSource.GroupDescriptions> 
    <CollectionViewSource.SortDescriptions> 
     <scm:SortDescription PropertyName="Date"/> 
    </CollectionViewSource.SortDescriptions> 
</CollectionViewSource> 

<HierarchicalDataTemplate x:Key="GroupDataTemplate" ItemsSource="{Binding Items}" > 
    <TextBlock Text="{Binding Name}" /> 
</HierarchicalDataTemplate> 

<TreeView x:Name="ItemHolder" x:FieldModifier="private" 
    ItemsSource="{Binding Source={StaticResource GroupedItems}, Path=Groups}" 
... />