Что вам нужно сделать, это создать запрос, который каким-то образом группирует ваши элементы по категориям (либо у вас уже есть, либо вы можете использовать linq для создания своей иерархии через группу By ... Into query).
Затем вы можете использовать ItemControl, который связывается с результатом запроса, отображая данные с помощью ItemTemplate, содержащего заголовок, и другой элемент ItemsControl, который имеет ItemPanelTemplate, установленный в WrapPanel или UniformGrid.
Предполагая, что вам удастся получить ваши данные в следующих классах (извините, VB здесь, но C# не будет далеко, что, если вам это нужно):
Public Class Category
Private _Name As String
Public Property CategoryName() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
Private _SubCategories As New List(Of SubCategory)
Public Property SubCategories() As List(Of SubCategory)
Get
Return _SubCategories
End Get
Set(ByVal value As List(Of SubCategory))
_SubCategories = value
End Set
End Property
End Class
Public Class SubCategory
Private _Name As String
Public Property SubCategoryName() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
End Class
<ItemsControl ItemsSource="{Binding QueryResult}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderThickness="1"
BorderBrush="Black">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Border BorderThickness="1"
BorderBrush="Black">
<TextBlock Margin="2"
Text="{Binding CategoryName}" />
</Border>
<ItemsControl Grid.Row="1"
ItemsSource="{Binding SubCategories}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderThickness="1"
BorderBrush="Black">
<TextBlock Margin="2"
Text="{Binding SubCategoryName}" />
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Columns="3" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Это очень грубый шаблон, вы» мне нужно будет возиться с границами, чтобы получить то, что вам нужно, но это сделало бы трюк.
UniformGrid не существует в silverlight, поэтому я использовал этот пользовательский код: http://www.jeff.wilcox.name/2009/01/uniform-grid/ –
Правда, его нет, и я использую тот, который я лежат, потому что это может быть полезно ... –
другая реализация UniformGrid для Silverlight http://jobijoy.blogspot.com/2010/03/uniformgrid-for-silverlight-ported-from.html –