2010-02-11 83 views
7

我試圖讓我的樹視圖按照它們的內容對類似項的集合進行分組。爲了保持通用的,我的對象層次結構看起來是這樣的:在WPF TreeView中對子對象進行分組

  • 對象
    • 對象組#1
      • 項目#1( 'A' 型)
      • 項目#2(類型 'A')
      • 項目#3(類型 'B')
      • 項目#4(類型 'B')

現在我的TreeView控件顯示了這些對象完全一樣的對象模型,但我想這樣做是插入每個對象類型的TreeView節點,以便它看起來像這樣:

  • 對象
    • 對象組#1
      • A型
        • 項目#1
        • 項目#2
      • 類型B
        • 項目#3
        • 項目#4

我在這裏過類似的問題看見有人建議有兩個獨立的HierarchicalDataTemplates所以我創建了一個包含同類型的列表一個TreeView「對象組#1」的水平,但是這是真的笨拙,因爲它是一個整個獨立的TreeView內部的一些節點。我也一直試圖用CollectionViewSource來過濾每個類別中的項目,但是這對我來說並不是很好,因爲我無法弄清楚如何顯示它們。

我想我的問題歸結爲:如何使一個HierarchicalDataTemplate組它的孩子嗎?如果有人能指出我正確的方向,我會很感激。

我可以張貼一些代碼,如果有人想看到的,但我真的只是想弄清楚如何做我想做的,所以我的代碼只是一個非常簡單的數據綁定的TreeView現在。

回答

5

查看this Mr. Sumi的文章。我相信它會幫助你。

+0

這正是我需要看到的。謝謝。 – aalex675

0

AFAIK,HierarchicalDataTemplate不能分組其子。

視圖應該只顯示無論它得到,沒有真正挖掘到的對象種類/組......你爲什麼不以你的對象模型創建這些組?

和視圖只會得到水木清華這樣的:

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

,並使用HierarchicalDataTemplate顯示。

7

您可以通過使用IValueConverter綁定HierarchicalDataTempalate上的ItemsSource來實現此效果。該轉換器是簡單地執行以下操作:

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

現在你HierarchcialDataTemplate可以如下:

<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};'不編譯;或許'select new {Type = g.First()。Type,Items = g};'? – arolson101

+1

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

0

如果這是一個套間系列簡單的分組方法,您正在尋找可能顯示目的使用「CollectionViewSource」會更合適。由於Property/Collection Change事件的傳播,使用LINQ可能會變成一場噩夢。

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