В WPF/Silverlight можно ли привязать к HTML-подобному TableControl?
Учитывая следующие категории и подкатегории:
- Анимации (Family Guy, Calvin & Hobes, The Boondocks, Duck Tales, Looney Toons, Pink & The Brain)
- Улица Сезам (Оскар, Эрни и Берт, Кермит де Фрог, Элмо, Cookie Monster, Гровер)
Я ищу способ визуализировать его (динамически) в строки и столбцы следующим образом:
-------------------------------------------------- - | Анимации | -------------------------------------------------- - | Семейный парень | Кальвин и Хобс | Бундоки | -------------------------------------------------- - | Утиные сказки | Луни Мультс | Пинки и Мозг | -------------------------------------------------- - | Улица Сезам | -------------------------------------------------- - | Оскар | Эрни и Берт | Кермит де Лягушка | -------------------------------------------------- - | Элмо | Cookie Monster | Гровер | -------------------------------------------------- -
P / S: Мне известны элементы управления списком (ItemsControl, DataGrid, ListView и т. Д.), И ни один из них, похоже, не соответствует этому критерию.
1 ответ
Что вам нужно будет сделать, это создать запрос, который каким-то образом группирует ваши элементы по категориям (либо у вас это уже есть, либо вы можете использовать linq для создания вашей иерархии с помощью запроса "Группировать по... в").
Затем вы можете использовать ItemsControl, который связывается с результатом запроса, отображая данные с помощью ItemTemplate, содержащего заголовок, и другого ItemsControl, у которого для ItemsPanelTemplate установлено значение 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>
Это очень грубый шаблон, вам придется повозиться с границами, чтобы получить то, что вам нужно, но это бы сработало.