Как выровнять отдельные сетки, созданные с помощью шаблонов, по их столбцам/строкам?

Я думаю, что в данном случае картинка стоит тысячи слов:

альтернативный текст

XAML:

 <Grid>
    <ItemsControl ItemsSource="{Binding Persons}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="{Binding Name}" Background="LightBlue"/>
                    <TextBlock Text="{Binding Age}" Background="LightPink" Grid.Column="1"/>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

p.s. Я не хочу задавать конкретное значение для первого столбца, а дать ему максимальное значение, которое ему нужно.

Обновление: я попробовал ссылку ColinE и сделал следующее:

 <Grid.ColumnDefinitions>
                        <ColumnDefinition SharedSizeGroup="A" Width="Auto"/>
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>

но это не сработало для меня.


person Erez    schedule 05.01.2011    source источник


Ответы (2)


Вам нужно использовать SharedSizeGroup для каждого столбца.

Посмотрите этот урок...

http://blogs.interknowlogy.com/johnbowen/archive/2007/08/27/21132.aspx

Кроме того, убедитесь, что свойство области общего размера истинно для вашей сетки:

<Grid  Grid.IsSharedSizeScope="True">
    <ItemsControl ItemsSource="{Binding Persons}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" SharedSizeGroup="A"/>
                        <ColumnDefinition/>
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="{Binding Name}" Background="LightBlue"/>
                    <TextBlock Text="{Binding Age}" Background="LightPink" Grid.Column="1"/>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>
person ColinE    schedule 05.01.2011
comment
Спасибо, я пытался кое-как использовать SharedSizeGroup, но так и не смог решить проблему. Один из них — это то, что находится в обновленной области. - person Erez; 05.01.2011
comment
Также измените первый экземпляр сетки контейнера, чтобы он имел атрибут ‹Grid Grid.IsSharedSizeScope=True›. Тогда нормально работает :) - person Tom; 05.01.2011
comment
Спасибо, Том... IsSharedSizeScope упоминается в этом руководстве, но не показано в примерах. я обновил ответ - person ColinE; 05.01.2011

Вместо использования Grid как насчет использования DataGrid?

<Grid>

    <DataGrid ItemsSource="{Binding}" 
             AutoGenerateColumns="False" 
             IsReadOnly="True" 
             CanUserAddRows="False" 
             ColumnHeaderHeight="0" 
             GridLinesVisibility="None">

        <DataGrid.Resources>

            <Style TargetType="DataGridCell" x:Key="NameStyle">
                <Setter  Property="Background" Value="LightBlue"/>
                <Setter Property="BorderBrush" Value="LightBlue"/>
            </Style>

            <Style TargetType="DataGridCell" x:Key="AgeStyle">
                <Setter  Property="Background" Value="LightPink"/>
                <Setter Property="BorderBrush" Value="LightPink"/>
            </Style>

        </DataGrid.Resources>

        <DataGrid.Columns>

            <DataGridTextColumn Binding="{Binding Name}" 
                                CellStyle="{StaticResource ResourceKey=NameStyle}"/>

            <DataGridTextColumn Binding="{Binding Age}" 
                                CellStyle="{StaticResource ResourceKey=AgeStyle}"/>

        </DataGrid.Columns>

    </DataGrid>

</Grid>
person Tim Murphy    schedule 05.01.2011
comment
Спасибо Тим, поскольку мои данные предназначены только для чтения, мне кажется неоправданным использование DataGrid. - person Erez; 05.01.2011