2013-07-09 27 views
2

我是一個相當新手的程序員,並製作Windows應用商店應用。我有一個包含ObservableCollection(Of T)的對象,我想將它們分組顯示在ListView中。使用LINQ返回一組分組項目似乎是最好也是最簡單的選擇。我可以找到的每一份文檔都說Group By返回IEnumerable(Of IGrouping(Of TKey, TItem)),並且您將CollectionViewSource.IsSourceGrouped設置爲True,綁定到CVS並且它應該都能正常工作。對?使用LINQ和VB.NET在Windows Store應用程序(Metro)中分組Collection的正確方法是什麼?

並非如此。

我有一個包含

Public Property Items As ObservableCollection(Of Item) 

Public ReadOnly Property GroupedItems As IEnumerable 
    Get 
     ' Return grouped items 
    End Get 
End Property 

和A類的XAML的頁面,在這裏GroupedItems設置爲PageDataContext在後臺代碼:

<Page.Resources> 
    <CollectionViewSource x:Name="GroupedItems" Source="{Binding}" IsSourceGrouped="True" /> 
</Page.Resources> 

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}"> 
    <ListView ItemsSource="{Binding Source={StaticResource GroupedItems}}"> 
     <ListView.GroupStyle> 
      <GroupStyle.HeaderTemplate> 
       <DataTemplate> 
        <!-- Template --> 
       </DataTemplate> 
      </GroupStyle.HeaderTemplate> 
     </ListView.GroupStyle> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <!-- Template --> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
</Grid> 

現在,如果我將ListView直接綁定到ObservableCollection(Of Item)ListView按照預期呈現所有項目,跟在ItemTemplate之後。但是當它被綁定到所謂的分組CollectionViewSource時,ListView根據HeaderTemplate呈現組,但它不呈現組內的任何項目。

我已經檢查了LINQ邏輯的結果:

Dim x = From i As Item In Items 
     Group i By Key = i.SubItem Into Group 

而且xKey屬性和Group財產,雖然這是某種形式的IEnumerable的(匿名)類型,而不是IEnumerable(Of IGrouping(Of TKey, TItem))

那麼我在這裏做錯了什麼?我錯過了LINQ的VB.NET實現嗎?我忘了設置一個屬性嗎?什麼是正確的方法來做到這一點?

回答

1

我找到了一個解決方案,但我不知道它是理想的解決方案。由於LINQ查詢的結果將項目置於其匿名類型的Group屬性中,因此CollectionViewSource需要知道這一點。因此,通過將ItemsPath="Group"添加到定義CollectionViewSource的XAML中,它現在顯示組標題和包含項目。

相關問題