ListBox中的WPF数据绑定错误

时间:2009-11-10 18:07:53

标签: wpf data-binding binding listbox ivalueconverter

我有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}" />

使用DataTemplateValueConverter又使用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[]ListBox

当我执行代码时,它说它无法在Int32上找到'ItemCount'。我以为它从ValueConverter获得了项目数(我显然是错的)。

有人可以告诉我如何让我的{{1}}知道我在做什么项目。

由于

3 个答案:

答案 0 :(得分:1)

数据模板中项目的数据上下文是数据项本身,它是int。如果您想要ListBox上的某个媒体资源,则需要在当前情境之外达到这一目标。您可以使用RelativeSource执行此操作:

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

答案 1 :(得分:1)

假设你的第一个转换器参数是要绘制的实际值,第二个是直方图对象:

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

这是因为DataContext本身就是整数,至少从您给出的错误消息中可以看出这种情况。

顺便说一句,您通常会使用绑定设置ListBox的ItemsSource,而不是使用代码隐藏。这样可以更清晰地分离UI和代码。我注意到你的示例代码中没有显示ItemsSource=,所以我想我应该提一下。

答案 2 :(得分:0)

您可以尝试使用绑定:

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