DataTemplate для ItemTemplate сетки, отображающей ее содержимое в столбцах - PullRequest
0 голосов
/ 15 июля 2010

У меня есть 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

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

Ответы [ 2 ]

1 голос
/ 15 июля 2010

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

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

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

0 голосов
/ 15 июля 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>
...