ListView column auto sizing ListView column auto sizing wpf wpf

ListView column auto sizing


There is no easy way to do this with a GridListView since it doesn't support setting the width of a column to "*" (fill remaining space).

Here is a discussion of how you could fake it by using an IValueConverter to set the width of the column to TotalListWidth - SumOfColumnWidths

On the other hand, have you considered using a DataGrid instead? This will support the kind of layout you are looking for, though is a considerably heavier control. It is also only native in .NET 4 - though you can get an equivalent for 3.5 through the WPF Toolkit.


Set Width="Auto" on your GridViewColumns. However, due to virtualization you may encounter some problems with auto-sizing.

See this question.

So, long-story-short, if you want accurate auto-sizing of columns you'll need to recalculate your widths when the visible data changes, due to virtualization.


<Grid Name="dummygrid" Visibility="Hidden">            <Grid.ColumnDefinitions>                <ColumnDefinition Width="0.5*"></ColumnDefinition>                <ColumnDefinition Width="0.2*"></ColumnDefinition>                <ColumnDefinition Width="0.1*"></ColumnDefinition>                <ColumnDefinition Width="0.2*"></ColumnDefinition>                <ColumnDefinition Width="150"></ColumnDefinition>            </Grid.ColumnDefinitions>            <Border Grid.Column="0" Name="dummywidth1"></Border>            <Border Grid.Column="1" Name="dummywidth2"></Border>            <Border Grid.Column="2" Name="dummywidth3"></Border>            <Border Grid.Column="3" Name="dummywidth4"></Border>            <Border Grid.Column="5" Name="dummywidth5"></Border>        </Grid>        <ListView  Name="Installer_LV" Grid.Row="1" ItemContainerStyle="{StaticResource LV_ItemStyle}" ScrollViewer.HorizontalScrollBarVisibility="Disabled"  AlternationCount="2">            <ListView.View>                <GridView ColumnHeaderContainerStyle="{StaticResource LV_HeaderStyle}">                    <GridViewColumn  Width="{Binding ElementName=dummywidth1, Path=ActualWidth}"  DisplayMemberBinding="{Binding DisplayName}" >                        <GridViewColumn.Header>                            <GridViewColumnHeader Tag="DisplayName" Click="InstallerLV_HeaderClick">Name</GridViewColumnHeader>                        </GridViewColumn.Header>                    </GridViewColumn>                    <GridViewColumn  Width="{Binding ElementName=dummywidth2, Path=ActualWidth}" DisplayMemberBinding="{Binding Publisher}">                        <GridViewColumn.Header>                            <GridViewColumnHeader Tag="Publisher" Click="InstallerLV_HeaderClick">Publisher</GridViewColumnHeader>                        </GridViewColumn.Header>                    </GridViewColumn>                    <GridViewColumn  Width="{Binding ElementName=dummywidth3, Path=ActualWidth}" DisplayMemberBinding="{Binding Version}">                        <GridViewColumn.Header>                            <GridViewColumnHeader Tag="Version" Click="InstallerLV_HeaderClick">Version</GridViewColumnHeader>                        </GridViewColumn.Header>                    </GridViewColumn>                    <GridViewColumn  Width="{Binding ElementName=dummywidth4, Path=ActualWidth}" DisplayMemberBinding="{Binding Size}">                        <GridViewColumn.Header>                            <GridViewColumnHeader Tag="Size" Click="InstallerLV_HeaderClick">Size</GridViewColumnHeader>                        </GridViewColumn.Header>                    </GridViewColumn>                    <GridViewColumn Header="Action" Width="150">                        <GridViewColumn.CellTemplate>                            <DataTemplate>                                <Button  Height="38" Width="130" Style="{DynamicResource RoundedButton}" Content="{Binding Status}" Tag="{Binding ModuleId}"  HorizontalAlignment="Center" VerticalAlignment="Center" Click="onActionClick"></Button>                            </DataTemplate>                        </GridViewColumn.CellTemplate>                    </GridViewColumn>                </GridView>            </ListView.View>        </ListView>

In the above example i have used a dummy grid and split into 5 columns and using binding assign that size to "GridViewColum" by

Width="{Binding ElementName=dummywidth4, Path=ActualWidth}"

So that when the hidden dummy grid column size changes it will get reflect in gridview column size also.