Erro de ligação de dados WPF no ListBox
-
19-09-2019 - |
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
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>