views:

221

answers:

3

I have a listbox

<ListBox x:Name="HistogramListBox" Grid.Column="1" Margin="8,2,8,0"
            HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
            Template="{StaticResource HistogramListBoxControlTemplate}"
            ItemContainerStyle="{StaticResource HistogramListBoxItem}"
            ItemTemplate="{DynamicResource BucketTemplate}" />

That uses a datatemplate that in turn uses a valueconverter to determine the height of the listboxitem

<DataTemplate x:Key="BucketTemplate">
        <StackPanel>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="100"/>
                </Grid.RowDefinitions>
                <StackPanel HorizontalAlignment="Stretch" VerticalAlignment="Bottom">
                    <Rectangle Grid.Row="0" StrokeThickness="1" VerticalAlignment="Bottom" 
                        Stroke="{Binding ElementName=MainElement, Path=BucketStroke}" 
                        Fill="{Binding ElementName=MainElement, Path=BucketFill}" >
                        <Rectangle.Height>
                            <MultiBinding Converter="{StaticResource HistogramValueToPercentageConverter}">
                                <Binding Mode="OneWay" Path="ItemCount" />
                                <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type local:Histogram}}" />
                            </MultiBinding>
                        </Rectangle.Height>
                    </Rectangle>
                </StackPanel>
            </Grid>
        </StackPanel>
    </DataTemplate>

The listbox ItemSource is an int[]

When I execute the code it says it can't find 'ItemCount' on an Int32. I thought it got the item count from the listbox (I'm obviously wrong).

Can someone tell me how I can get my valueconverter to know what item I am on.

Thanks

Dan

+1  A: 

The data context of the items in the data template is the data item itself, which is an int. If you want to a property on the ListBox, you'll need to reach outside of your current context to do so. You can use a RelativeSource to do this:

{Binding Items.Count, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}

HTH,
Kent

Kent Boogaart
I'm pretty sure ListBox doesn't have an ItemCount property, right?
Drew Marsh
@Drew: true. I just copied the OP. Updated my post.
Kent Boogaart
Items.Count gives me the total number of items. I was looking for the item that it is currently on in the listbox. Thanks
Dan dot net
A: 

You can try this for your Binding:

<Binding Path="Items.Count">
    <Binding.RelativeSource>
        <RelativeSource AncestorType="{x:Type ListBox}" />
    </Binding.RelativeSource>
</Binding>
Drew Marsh
A: 

Assuming your first converter parameter is intended to be the actual value being charted and the second the Histogram object:

<Rectangle.Height>
  <MultiBinding Converter="{StaticResource HistogramValueToPercentageConverter}">
    <Binding />
    <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type local:Histogram}}" />
  </MultiBinding>
</Rectangle.Height>

This is because the DataContext is the integer itself, at least that appears to be the case from the error message you gave.

By the way, you would normally set the ListBox's ItemsSource using a binding, not from code-behind. This leads to much cleaner separation of UI and code. I noticed no ItemsSource= was shown in your example code so I thought I should mention this.

Ray Burns
Thanks Ray, I knew it was something stupid I was missing
Dan dot net