Search code examples
c#wpfxamlgridstackpanel

StackPanel inside Grid - how to put its elements in different columns


Here's my code:

<Grid x:Name="SourceGrid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>

    </Grid.RowDefinitions>

        <TextBlock Grid.Row="0" Grid.Column="0" Text="Headers" />
        <TextBlock Grid.Row="0" Grid.Column="1" Text="Tags" />



    <ItemsControl Grid.Row="1" Grid.ColumnSpan="2" ItemsSource="{Binding Path=AllHeaders.Fields}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{Binding}" />
                    <ComboBox ItemsSource="{Binding ElementName=SourceGrid, Path=DataContext.Tags}" />
                </StackPanel>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Grid>

As you can see, I have a TextBlock and a ComboBox inside of a DataTemplate, which is inside of a StackPanel. What I want to do is put TextBlock in Column=0 of my grid, and a ComboBox into Column=1 of my grid. How can I do that? Grid.Column property is inaccessible in both TextBlock and ComboBox.


Solution

  • this is your new layout:

    <Grid x:Name="SourceGrid">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
    
            <TextBlock Grid.Row="0"
                       Grid.Column="0"
                       Text="Headers" />
            <TextBlock Grid.Row="0"
                       Grid.Column="1"
                       Text="Tags" />
    
            <ItemsControl Grid.Row="1"
                          Grid.ColumnSpan="2"
                          ItemsSource="{Binding Path=AllHeaders.Fields}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid x:Name="SourceGrid">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition />
                                <ColumnDefinition />
                            </Grid.ColumnDefinitions>
                            <TextBlock Text="{Binding}"
                                       Grid.Column="0" />
                            <ComboBox ItemsSource="{Binding Path=DataContext.Tags, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type Grid},AncestorLevel=2}}"
                                      Grid.Column="1" />
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Grid>
    

    or

      <Grid x:Name="SourceGrid">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>
    
            <TextBlock Grid.Row="0"
                       Grid.Column="0"
                       Text="Headers" />
            <TextBlock Grid.Row="0"
                       Grid.Column="1"
                       Text="Tags" />
    
            <ItemsControl Grid.Row="1"
                          Grid.ColumnSpan="2"
                          ItemsSource="{Binding Path=AllHeaders.Fields}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Grid x:Name="SourceGrid">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition />
                                <ColumnDefinition />
                            </Grid.ColumnDefinitions>
                            <TextBlock Text="{Binding}"
                                       Grid.Column="0" />
                            <ComboBox ItemsSource="{Binding Path=DataContext.Tags, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ItemsControl}}}"
                                      Grid.Column="1" />
                        </Grid>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </Grid>