2010-02-11 18 views
7

Sto cercando di ottenere la visualizzazione struttura per raggruppare una raccolta di elementi simili in base a ciò che sono. Per mantenere le cose generiche, la mia gerarchia di oggetti potrebbe essere la seguente:Raggruppamento di oggetti figlio in WPF TreeView

  • Oggetti
    • oggetto Gruppo # 1
      • Articolo # 1 (tipo 'A')
      • Articolo # 2 (tipo 'A')
      • Articolo # 3 (tipo 'B')
      • # punto 4 (tipo 'B')

questo momento il mio TreeView mostra questi oggetti esattamente come il modello a oggetti, ma quello che vorrei fare è inserire un nodo di TreeView per ogni tipo di oggetto in modo che sarebbe simile a questa:

  • oggetti
    • oggetto Gruppo # 1
      • tipo A
        • Articolo # 1
        • Articolo # 2
      • Tipo B
        • Articolo # 3
        • Articolo # 4

Ho visto in una domanda simile qui che qualcuno consigliava di avere due separati HierarchicalDataTemplates così ne ho creato uno per il livello "Gruppo 1" che contiene un TreeView con un elenco dei tipi, ma questo è davvero maldestro poiché è un intero TreeView separato all'interno di alcuni nodi. Ho anche cercato di usare uno CollectionViewSource per filtrare gli elementi in ogni categoria, ma questo non mi fa molto bene dato che non riesco a capire come visualizzarli.

Credo che la mia domanda si riduce a questo: Come faccio a fare un gruppo HierarchicalDataTemplate sono i bambini? Se qualcuno potesse indicarmi la giusta direzione, lo apprezzerei molto.

Posso postare del codice se qualcuno vuole vedere, ma sto solo cercando di capire come fare ciò che voglio, quindi il mio codice è solo un databound treeview piuttosto semplice in questo momento.

risposta

5

Dai un'occhiata all'articolo this di Mr. Sumi. Sono sicuro che ti aiuterà.

+0

Questo è esattamente ciò che avevo bisogno di vedere. Grazie. – aalex675

0

AFAIK, HierarchicalDataTemplate non può raggruppare i propri figli.

La vista dovrebbe solo visualizzare tutto ciò che ottiene, senza scavare davvero nei tipi/gruppi di oggetti ... Perché non si creano questi gruppi nel modello a oggetti?

E la vista sarà solo ottenere smth come:

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

e visualizzarlo utilizzando il HierarchicalDataTemplate.

7

È possibile ottenere questo effetto vincolando lo allo HierarchicalDataTempalate utilizzando un IValueConverter. Questo convertitore è semplicemente esegue le seguenti operazioni:

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 }; 
    } 
    ... 
} 

Ora il vostro HierarchcialDataTemplate può essere la seguente:

<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

'seleziona new {Type = item.Type, Items = g};' non viene compilato; forse 'seleziona new {Type = g.First(). Type, Items = g};'? – arolson101

+1

'seleziona new {Type = g.Key, Items = g}' funziona – arolson101

0

Se si tratta di un semplice metodo di raggruppamento da una collezione piatto a scopo di visualizzazione che si sta cercando forse usare una "CollectionViewSource" sarà più adatto. L'utilizzo di LINQ potrebbe diventare un incubo a causa della propagazione dell'evento di modifica proprietà/raccolta.

<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}" 
... />