Question

The setup:

ListView with GridView that is initially hidden when the window is loaded, and then made visible upon a certain user action.

The aim:

Be able to set relative width of GridView's columns.

The problem:

What I need can be achieved either by using a converter on the width (something similar to the answer here), or by adding a Behavior on the ListView (see this solution). The both approaches seem to be valid - but only for the controls that are rendered from the early beginning. In my case, the ActualWidth is always 0 when the calculations are made, and these calculations are not repeated when the ListView is made visible.

So, I guess, the real question here is how to get the columns' Width to be re-evaluated when ListView's ActualWidth gets greater than 0.

The solution would preferably be at the XAML level, without involving the code-behind - but that will do too, if that's the only alternative ;-)

Any suggestions?

P.S. Following Chris's question below, here's a clarification on how the ListView is hidden/shown: it's a child of another container control, hosted in a Grid column, and the width of that column is manipulated by a trigger.

<ColumnDefinition>
    <ColumnDefinition.Style>
        <Style>
            <Setter Property="ColumnDefinition.Width" Value="4*"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=OpenItems.Count}" Value="0">
                    <Setter Property="ColumnDefinition.Width" Value="0"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ColumnDefinition.Style>
</ColumnDefinition>

I tried to apply a similar trigger to the ListView's container itself (to manipulate its Visibility between Collapsed and Visible) instead, but the problem with that is that the Column doesn't shrink from its original 4* width, so I see the (empty) control when it's supposed to be hidden.

Was it helpful?

Solution

How are you hiding/showing the ListView? The question seems to imply that you are doing so by setting the Width property to 0 (or non-zero to show it). Instead, you should try using the Visibility property (set to "Collapsed" to hide, or "Visible" to show). This should cause the column's width to be re-evaluated.

UPDATE:

Based on your updated question, I'd suggest checking out this solution: http://www.codeproject.com/KB/grid/ListView_layout_manager.aspx

I got it from here FWIW: WPF : Extend last column of ListView's GridView

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top