我有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[]
是ListBox
。
当我执行代码时,它说它无法在Int32上找到'ItemCount'。我以为它从ValueConverter
获得了项目数(我显然是错的)。
有人可以告诉我如何让我的{{1}}知道我在做什么项目。
由于
丹
答案 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>