Ошибка привязки данных WPF в ListBox - PullRequest
1 голос
/ 10 ноября 2009

У меня есть 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 узнать, на каком предмете я нахожусь.

Спасибо

Dan

Ответы [ 3 ]

1 голос
/ 11 ноября 2009

Предполагая, что ваш первый параметр преобразователя предназначен для отображения фактического значения, а второй - для объекта гистограммы:

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

Это потому, что DataContext - это само целое число, по крайней мере, это так из сообщения об ошибке, которое вы дали.

Между прочим, вы обычно устанавливали бы ListSox's ItemsSource, используя привязку, а не из-за кода. Это приводит к гораздо более четкому разделению пользовательского интерфейса и кода. Я заметил, что ItemsSource= не было показано в вашем примере кода, поэтому я подумал, что должен упомянуть об этом.

1 голос
/ 10 ноября 2009

Контекст данных элементов в шаблоне данных - это сам элемент данных, который является int. Если вы хотите иметь свойство на ListBox, вам нужно выйти за пределы вашего текущего контекста, чтобы сделать это. Вы можете использовать RelativeSource для этого:

{Binding Items.Count, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}
0 голосов
/ 10 ноября 2009

Вы можете попробовать это для своей привязки:

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