Вопрос

у меня есть 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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top