Pergunta

eu tenho um 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}" />

Que usa a DataTemplate que, por sua vez, usa um ValueConverter para determinar a altura do 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>

o ListBox ItemsSource é um int[].

Quando executo o código, ele não pode encontrar 'ItemCount' em um INT32. Eu pensei que conseguiu a contagem de itens do ListBox (Estou obviamente errado).

Alguém pode me dizer como posso conseguir meu ValueConverter Para saber em que item estou.

Obrigado

Dan

Foi útil?

Solução

Supondo que seu primeiro parâmetro de conversor pretenda ser o valor real que está sendo mapeado e o segundo o objeto histograma:

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

Isso ocorre porque o datacontext é o próprio número inteiro, pelo menos esse parece ser o caso da mensagem de erro que você deu.

A propósito, você normalmente definiria o itens do ListBox usando uma ligação, não do código-behind. Isso leva a uma separação muito mais limpa da interface do usuário e do código. Eu notei não ItemsSource= foi mostrado no seu código de exemplo, então pensei em mencionar isso.

Outras dicas

O contexto de dados dos itens no modelo de dados é o próprio item de dados, que é um int. Se você quer uma propriedade no ListBox, você precisará chegar fora do seu contexto atual para fazê -lo. Você pode usar um RelativeSource para fazer isso:

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

Você pode tentar isso para sua ligação:

<Binding Path="Items.Count">
    <Binding.RelativeSource>
        <RelativeSource AncestorType="{x:Type ListBox}" />
    </Binding.RelativeSource>
</Binding>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top