Ошибка привязки данных WPF в ListBox
-
19-09-2019 - |
Вопрос
у меня есть 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}" />
Который использует DataTemplate
что, в свою очередь, использует ValueConverter
Чтобы определить высоту 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>
А ListBox
ItemsSource
является int[]
.
Когда я выполняю код, он говорит, что не может найти «Itemcount» на Int32. Я думал, что он получил количество предметов от ListBox
(Я, очевидно, неправ).
Кто -нибудь может сказать мне, как я могу получить свой ValueConverter
Чтобы знать, на каком предмет я нахожусь.
Спасибо
Дэн
Решение
Предполагая, что ваш первый параметр преобразователя предназначен для того, чтобы быть фактическим значением, а второе - объект гистограммы:
<Rectangle.Height>
<MultiBinding Converter="{StaticResource HistogramValueToPercentageConverter}">
<Binding />
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type local:Histogram}}" />
</MultiBinding>
</Rectangle.Height>
Это связано с тем, что DataContext является самим целым числом, по крайней мере, это похоже на то, что вы дали сообщение об ошибке.
Кстати, вы обычно устанавливаете элементы ListBox, используя привязку, а не из кода-бензина. Это приводит к более чистому разделению пользовательского интерфейса и кода. Я заметил нет ItemsSource=
был показан в вашем примере кода, поэтому я подумал, что должен упомянуть об этом.
Другие советы
Контекст данных элементов в шаблоне данных - это сам элемент данных, который является int
. Анкет Если вы хотите получить собственность на ListBox
, вам нужно будет достичь за пределами вашего текущего контекста, чтобы сделать это. Вы можете использовать RelativeSource
сделать это:
{Binding Items.Count, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}
Вы можете попробовать это для вашего привязки:
<Binding Path="Items.Count">
<Binding.RelativeSource>
<RelativeSource AncestorType="{x:Type ListBox}" />
</Binding.RelativeSource>
</Binding>