Windows 8 XAML ListView with Header and Item Template columns should have same dynamic width

主宰稳场 提交于 2019-12-05 10:45:44

The following works perfectly in my case:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Grid x:Name="ListViewHeaders" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition  />
            <ColumnDefinition  />
            <ColumnDefinition  />
            <ColumnDefinition  />
            <ColumnDefinition  />
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="0" Text="Title Col 1" />
        <TextBlock Grid.Column="1" Text="Title Col 2" />
        <TextBlock Grid.Column="2" Text="Title Col 3" />
        <TextBlock Grid.Column="3" Text="Title Col 4" />
        <TextBlock Grid.Column="4" Text="Title Col 5" />
    </Grid>
    <ListView x:Name="myTable" Grid.Row="1" ItemsSource="{Binding SomeCollection}" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Width="{Binding ElementName=myTable, Path=ActualWidth}" >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition  />
                        <ColumnDefinition  />
                        <ColumnDefinition  />
                        <ColumnDefinition  />
                        <ColumnDefinition  />
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="0" Text="{Binding ItemProperty1}" />
                    <TextBlock Grid.Column="1" Text="{Binding ItemProperty2}" />
                    <TextBlock Grid.Column="2" Text="{Binding ItemProperty3}" />
                    <TextBlock Grid.Column="3" Text="{Binding ItemProperty4}" />
                    <TextBlock Grid.Column="4" Text="{Binding ItemProperty5}" />
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

ListView does not operate like a DataGrid. ListView only understands rows and doesn't understand columns. You can simulate columns like you are by using a Grid, but the important thing to understand is that the item and the header are two completely separate UI elements.

Meaning there is no easy to have the size of the columns in the item change the size of the columns in the header. Even if you were to name them, they are part of a template so the names won't be of any use (remember, there will be multiple items created).

I recommend you stay with fixed widths, use * widths or use an actual DataGrid control.

The following worked for me. The key was to set the HorizontalContentAlignment property to Stretch.

<ListView Grid.Row="6" Name="lvMembersSearchResults" Background="LightGray" ItemClick="lvMembersSearchResults_ItemClick" IsItemClickEnabled="True" Margin="5,5,5,5">
            <ListView.ItemContainerStyle>
                <Style TargetType="ListViewItem">
                    <Setter Property="HorizontalContentAlignment"  Value="Stretch"></Setter>
                </Style>
            </ListView.ItemContainerStyle>
            <ListView.Header>
                <Style TargetType="ListViewHeaderItem">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
                </Style>
            </ListView.Header>
            <ListView.HeaderTemplate>
                <DataTemplate>
                    <Grid Height="30" Background="DarkGray">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="60"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="70"/>
                            <ColumnDefinition Width="50"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock x:Uid="tbRank" TextWrapping="Wrap" Text="Rank" Grid.Column="0" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="7,2,0,0" FontWeight="ExtraBold" FontSize="18" />
                        <TextBlock x:Uid="tbName" TextWrapping="Wrap" Text="Name" Grid.Column="1" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="7,2,0,0"  FontWeight="ExtraBold" FontSize="18" />
                        <TextBlock x:Uid="tbTaxId" TextWrapping="Wrap" Text="Tax ID" Grid.Column="2" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="7,2,0,0" FontWeight="ExtraBold" FontSize="18" />
                        <TextBlock x:Uid="tbCommand" TextWrapping="Wrap" Text="Cmd" Grid.Column="3" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="7,2,0,0" FontWeight="ExtraBold" FontSize="18" />
                    </Grid>
                </DataTemplate>
            </ListView.HeaderTemplate>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid Height="30" Background="DarkBlue">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="60"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="70"/>
                            <ColumnDefinition Width="50"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock TextWrapping="NoWrap"  Text="{Binding Rank}" Grid.Column="0" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="7,2,0,0" FontWeight="Bold"  FontSize="18"  />
                        <TextBlock TextWrapping="NoWrap" Text="{Binding Name}" Grid.Column="1" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="7,2,0,0" FontWeight="Bold"  FontSize="18"/>
                        <TextBlock TextWrapping="NoWrap" Text="{Binding TaxId}" Grid.Column="2" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="7,2,0,0" FontWeight="Bold"  FontSize="18"/>
                        <TextBlock TextWrapping="NoWrap" Text="{Binding Command}" Grid.Column="3" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="7,2,0,0" FontWeight="Bold"  FontSize="18"/>
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

Adding a UserControl worked for me.

<ListView x:Name="listView" ItemsSource="{Binding SomeCollection}" >
   <ListView.ItemTemplate>
       <DataTemplate>
           <UserControl Width="{Binding ElementName=listView, Path=ActualWidth}">
               <Grid> 
                 ....
                </Grid>
            </UserControl>
       </DataTemplate>
   </ListView.ItemTemplate>
</ListView>`

For stretching items to full ListView width try this:

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="80" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding Number}" />
                <TextBlock Grid.Column="1" Text="{Binding Text}" />
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

You can try to create your own UserControl with properties that calculates width for each column and bind to this properties in template. May be this help.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!