В WPF / Silverlight можно ли привязать к HTML-подобному TableControl? - PullRequest
1 голос
/ 20 апреля 2009

Учитывая следующие категории и подкатегории:

  1. Анимации (Family Guy, Calvin & Hobes, The Boondocks, Duck Tales, Looney Toons, Pink & The Brain)
  2. Улица Сезам (Оскар, Эрни и Берт, Кермит де Фрог, Элмо, Cookie Monster, Гровер)

Я ищу способ (динамически) отобразить его в строки и столбцы следующим образом:

----------------------------------------------------
| 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            |
----------------------------------------------------

P / S: мне известны элементы управления списком (ItemsControl, DataGrid, ListView и т. Д.), И ни один из них, похоже, не соответствует этому критерию.

1 Ответ

2 голосов
/ 20 апреля 2009

Что вам нужно будет сделать, это создать запрос, который каким-то образом группирует ваши элементы по категориям (либо у вас это уже есть, либо вы можете использовать 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>

Это очень грубый шаблон, вам придется повозиться с границами, чтобы получить то, что вам нужно, но это бы сработало.

...