windowsxamllistviewuwpstretching

UWP Nested ListView no stretch


I am trying to nest one ListView into another, but the problem is that in the second ListView I need the grid to use all the width of the window in order to split it in 3 same sized columns. But as u can see, it doesn't do that.... I have tried everything already, any ideas on how could I make it work?

<Grid Background="Pink">
    <ListView x:Name="MainListView"
              ItemsSource="{x:Bind menu}"
              HorizontalAlignment="Stretch"
              Background="BlanchedAlmond"
              HorizontalContentAlignment="Stretch">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="data:MainCategories">
                <Grid Background="blue" HorizontalAlignment="Stretch" >
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="{x:Bind CategoryName}"
                               HorizontalAlignment="Stretch"                                   
                               FontSize="25"                                   
                               Foreground="Yellow" />
                    <ListView x:Name="SubListView"
                              Grid.Row="1"
                              Background="YellowGreen"
                              HorizontalAlignment="Stretch"
                              HorizontalContentAlignment="Stretch"
                              ItemsSource="{x:Bind SubMenuItems}">
                        <ListView.ItemTemplate>
                            <DataTemplate x:DataType="data:Dishes">                                                                            
                                <Grid HorizontalAlignment="Stretch">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="1*" />
                                        <ColumnDefinition Width="1*" />
                                        <ColumnDefinition Width="1*" />
                                    </Grid.ColumnDefinitions>
                                    <TextBlock Foreground="Red"
                                               Text="{x:Bind dishName}"
                                               Grid.Column="0"
                                               HorizontalAlignment="Center" />
                                    <TextBlock Foreground="Red"
                                               Grid.Column="1"
                                               HorizontalAlignment="Center"
                                               Text="{x:Bind dishPrice}" />
                                    <TextBlock Foreground="Red"
                                               Grid.Column="2"
                                               HorizontalAlignment="Center"
                                               Text="{x:Bind dishPrice}" />

                                </Grid>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

app screenshot

public void FillMenu()
    {
        menu.Add(new MainCategories() { CategoryName = "tittle1" });
        menu[0].SubMenuItems.Add(new Dishes() { dishName = "dish1", dishPrice = 1 });
        menu[0].SubMenuItems.Add(new Dishes() { dishName = "dish2", dishPrice = 11 });
        menu[0].SubMenuItems.Add(new Dishes() { dishName = "dish3dish3dish3", dishPrice = 12 });
        menu.Add(new MainCategories() { CategoryName = "tittle2" });
        menu[1].SubMenuItems.Add(new Dishes() { dishName = "dishab", dishPrice = 13 });
        menu[1].SubMenuItems.Add(new Dishes() { dishName = "sishro", dishPrice = 14 });
    }

Solution

  • You need to set the HorizontalAlignment="Stretch" for the ListViewItem as follows.

    <ListView.ItemContainerStyle>
       <Style TargetType="ListViewItem">
           <Setter Property="HorizontalContentAlignment" Value="Stretch" />
       </Style>
    </ListView.ItemContainerStyle>
    

    Set the HorizontalAlignment property for the controls inside ListViewItem template will not take effects for the layout of ListViewItem. Updated completing code as follows.

    <Grid Background="Pink">
        <ListView x:Name="MainListView"
              ItemsSource="{x:Bind menu}"
              HorizontalAlignment="Stretch"
              Background="BlanchedAlmond"
              HorizontalContentAlignment="Stretch">
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.ItemTemplate>
                <DataTemplate x:DataType="local:MainCategories">
                    <Grid Background="blue"  >
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{x:Bind CategoryName}" 
                               FontSize="25"                                   
                               Foreground="Yellow" />
                        <ListView x:Name="SubListView"
                              Grid.Row="1"
                              Background="YellowGreen" 
                              ItemsSource="{x:Bind SubMenuItems}">
                            <ListView.ItemContainerStyle>
                                <Style TargetType="ListViewItem">
                                    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
                                </Style>
                            </ListView.ItemContainerStyle>
                            <ListView.ItemTemplate>
                                <DataTemplate x:DataType="local:Dishes">
                                    <Grid HorizontalAlignment="Stretch">
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition Width="1*" />
                                            <ColumnDefinition Width="1*" />
                                            <ColumnDefinition Width="1*" />
                                        </Grid.ColumnDefinitions>
                                        <TextBlock Foreground="Red"
                                               Text="{x:Bind dishName}"
                                               Grid.Column="0"
                                               HorizontalAlignment="Center" />
                                        <TextBlock Foreground="Red"
                                               Grid.Column="1"
                                               HorizontalAlignment="Center"
                                               Text="{x:Bind dishPrice}" />
                                        <TextBlock Foreground="Red"
                                               Grid.Column="2"
                                               HorizontalAlignment="Center"
                                               Text="{x:Bind dishPrice}" />
                                    </Grid>
                                </DataTemplate>
                            </ListView.ItemTemplate>
                        </ListView>
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>
    

    And the result enter image description here