DataTemplate для ItemTemplate сетки, отображающей ее содержимое в столбцах

У меня есть HeaderedItemsControl, который ItemsSource привязан к ObservableCollection<Person>. Я хотел бы отобразить его содержимое, например:

*Name*       Müller      Schmid    Weber
*FirstName*  Peter       Hans      Willhelm
*Age*        32          56        78
*Country*    Switzerland Austria   Liechtenstein

Мой xaml-код до сих пор:

<HeaderedItemsControl ItemsSource="{Binding Path=PersonCollection}">
        <HeaderedItemsControl.Template>
            <ControlTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                        <RowDefinition />
                        <RowDefinition />
                     </Grid.RowDefinitions>
                    <TextBlock Grid.Column="0" Grid.Row="0" Text="Name"/>
                    <TextBlock Grid.Column="0" Grid.Row="1" Text="FirstName"/>
                    <TextBlock Grid.Column="0" Grid.Row="2" Text="Age"/>
                    <TextBlock Grid.Column="0" Grid.Row="3" Text="Country"/>
                    <StackPanel Grid.RowSpan="4" Grid.Column="1" Orientation="Horizontal">
                        <ItemsPresenter/>
                    </StackPanel>
                </Grid>
            </ControlTemplate>
        </HeaderedItemsControl.Template>
        <HeaderedItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <Grid.RowDefinitions>
                            <RowDefinition />
                            <RowDefinition />
                            <RowDefinition />
                            <RowDefinition />
                    </Grid.RowDefinitions>
                        <Label Grid.Row="0" Content="{Binding Path=Name}" />
                        <Label Grid.Row="1" Content="{Binding Path=FirstName}" />
                        <Label Grid.Row="2" Content="{Binding Path=Age}" />
                        <Label Grid.Row="3" Content="{Binding Path=Country}"/>
                </StackPanel>
            </DataTemplate>
        </HeaderedItemsControl.ItemTemplate>
    </HeaderedItemsControl>

Это дает мне что-то вроде:

*Name*       Müller
             Schmid
             Weber
*FirstName*  Peter
             Hans
             Willhelm
*Age*        32
             56 
             78
*Country*    Switzerland
             Austria
             Liechtenstein

Есть ли способ, чтобы элементы были представлены в столбце?


person WaltiD    schedule 15.07.2010    source источник


Ответы (2)


В своем ControlTemplate вы обернули свой ItemsPresenter в StackPanel, который в этом случае ничего не делает, потому что у него есть один дочерний элемент: ItemsPresenter. На самом деле вам нужно, чтобы ItemsPresenter использовал этот StackPanel для выполнения своего внутреннего макета, которого вы достигаете, используя ItemsControl.ItemsPanel, чтобы определить шаблон для панели, на которой будут размещаться элементы, созданные элементом управления:

<HeaderedItemsControl.ItemsPanel>
  <ItemsPanelTemplate>
    <StackPanel Orientation="Horizontal"/>
  </ItemsPanelTemplate>
</HeaderedItemsControl.ItemsPanel>

Вам также необходимо изменить объявление StackPanel в вашем ItemTemplate на Grid, чтобы каждый элемент размещался в строках.

person John Bowen    schedule 15.07.2010
comment
Да спасибо. Теперь мой стол выглядит так, как я хочу. Я удалил StackPanel, который обертывал ItemsPresenter, установил ItemsPresenter Grid.Row и Grid.Column. - person WaltiD; 16.07.2010

Похоже, что в вашем ItemTemplate вы устанавливаете строку своих меток вместо столбцов, поэтому ваш контент будет располагаться вертикально. Кроме того, у вас есть метки, расположенные в StackPanel с вертикальной ориентацией, что заставит их отображаться в одном столбце. Я предполагаю, что вы ищете такой макет для своего ItemTemplate.

<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition/>
    <ColumnDefinition/>
    <ColumnDefinition/>
    <ColumnDefinition/>
  </Grid.ColumnDefinitions>
  <Label Grid.Column="0" Content="{Binding Path=Name}" />
  <Label Grid.Column="1" Content="{Binding Path=FirstName}" />
  <Label Grid.Column="2" Content="{Binding Path=Age}" />
  <Label Grid.Column="3" Content="{Binding Path=Country}"/>
</Grid>
person Jeff Wain    schedule 15.07.2010