В WPF / Silverlight можно ли привязаться к HTML-подобному TableControl?
-
12-09-2019 - |
Вопрос
Даны следующие категории и подкатегории:
- Анимационные фильмы (Гриффины, Кэлвин и Хобс, The Boondocks, Утиные сказки, Looney Toons, Pink & The Brain)
- Улица Сезам (Оскар, Эрни и Берт, Кермит де Фрог, Элмо, Куки Монстер, Гровер)
Я ищу способ отобразить его (динамически) в строках и столбцах следующим образом:
---------------------------------------------------- | Animations | ---------------------------------------------------- | Family Guy | Calvin & Hobes | The Boondocks | ---------------------------------------------------- | Duck Tales | Looney Toons | Pinky & The Brain | ---------------------------------------------------- | Sesame Street | ---------------------------------------------------- | Oscar | Ernie & Bert | Kermit de Frog | ---------------------------------------------------- | Elmo | Cookie Monster | Grover | ----------------------------------------------------
П/С:Я знаю о элементах управления списком (ItemsControl, DataGrid, ListView и т.д.), И ни один из них, похоже, не соответствует этим критериям.
Решение
Что вам нужно будет сделать, это создать запрос, который каким-то образом группирует ваши товары по категориям (либо у вас уже есть это, либо вы можете использовать linq для создания своей иерархии через Group By ...В запрос).
Затем вы можете использовать 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>
Это очень грубый шаблон, вам придется повозиться с границами, чтобы получить то, что вам нужно, но этого будет достаточно.