tags:

views:

38

answers:

2

I would like the items of my ListView to grow to take up the entire width of the avaliable space within the ListView. Currently, I have the item's width set like this (the ListView is named listView):

Width="{Binding ActualWidth, ElementName=listView, Mode=OneWay}"

The items will take up the width of the ListView. However, the vertical scroll bar is not taken into account. If the scroll bar is present, it is drawn on top of the right edge of the items.

Is it possible to fix this?

A: 

ActualWidth includes the scroll bar so I don't think there will be a way to fix that. What about using a Viewbox?

Maurizio Reginelli
How would I use a Viewbox?If I wrap my items in a Viewbox, all sorts of bad things will happen. I want to ask the items to grow to fit the avaliable space. The Viewbox allows the contents to use any space they desire, then it foribly expands or shrinks them to fit the avaliable space.It seems there should be some method to reference the width of the ItemsPresenter contained within the ScrollViewer inside the ListView. This should be the width I am looking for...
oillio
A: 

I solved this by referencing the ItemsPresenter directly. To do this, I needed to define a template for the Viewbox and name the ItemsPresenter.

The template looks like this:

<ListView.Template>
    <ControlTemplate TargetType="{x:Type ListView}">
        <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="1" SnapsToDevicePixels="true">
            <ScrollViewer Focusable="false" Padding="{TemplateBinding Padding}">
                <ItemsPresenter x:Name="MLVItemsPresenter" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
            </ScrollViewer>
        </Border>
       <--SNIP-->
    </ControlTemplate>
</ListView.Template>

And the width binding looks like this:

Width="{Binding ActualWidth, ElementName=MLVItemsPresenter, Mode=OneWay}"
oillio