0

这是从ItemsControl.ItemTemplate 属性 的MSDN 库文章中获取的 XAML 代码示例:

<ListBox Width="400" Margin="10" ItemsSource="{Binding Source={StaticResource myTodoList}}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Path=TaskName}" />
<TextBlock Text="{Binding Path=Description}"/>
<TextBlock Text="{Binding Path=Priority}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>  

我正在寻找对<StackPanel>元素用法的解释是this example。
->
这个面板将在 ListBox 中的什么位置存在?
它在 ItemTemplate 中的用途是什么?
可以使用任何 System.Windows.Controls.Panel 代替它,特别是网格吗?
我将如何使用一个<Grid>元素作为 ListBox 中每个项目的模板?

这是我要追求的概念:

http://img151.imageshack.us/img151/7960/graphconcept.png

我已经使用一个<Path>元素绘制了图表,那里没有问题。

我正在研究轴的标签,并且正在尝试使用<Grid>ItemTemplate 中的元素 - 但我不知道网格在这种情况下应该如何运作,而 MSDN 在他们的示例中没有提及面板代码。

我的 Y 轴标签的 XAML 当前如下所示:

<ListBox Background="Transparent" BorderThickness="0" ItemsSource="{Binding Path=GraphLabelYData}">
<ListBox.ItemTemplate>  
<DataTemplate>  
<Grid>  
<Grid.RowDefinitions>  
<RowDefinition Height="{Binding Path=GraphLabelSpacing}" />  
</Grid.RowDefinitions>  
<Grid.ColumnDefinitions>  
<ColumnDefinition Width="Auto" />  
<ColumnDefinition Width="{Binding ElementName=GraphLabelYData, Path=GraphLabelMarkerLength}" />  
</Grid.ColumnDefinitions>  
<TextBlock HorizontalAlignment="Right" VerticalAlignment="Bottom" Text="{Binding Path=GraphLabelTag}" />  
<Rectangle Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Bottom" Stroke="Black" Fill="Black" />  
</Grid>  
</DataTemplate>  
</ListBox.ItemTemplate>  
</ListBox>  

这看起来正确吗?运行时没有显示任何内容,但我想确保在开始调试数据绑定和代码隐藏之前正确建模 XAML。

4

1 回答 1

4

“这个面板将在 ListBox 中的什么位置存在?” - 列表框将为每个列表项制作一份副本,即为 myTodoList 集合中的每个元素制作一份。因此,在每个列表项中,您将拥有一个堆叠在一起的三个标签。

“它在 ItemTemplate 中的用途是什么?” - 可以为 ItemsSource 中的每个元素显示多个控件。与 WPF 中的许多东西一样,ItemTemplate 只能采用一个子元素,因此如果您想要多个子元素,则需要指定它们的布局方式,并通过添加一个面板(在本例中为 StackPanel)来实现。

“可以使用任何 System.Windows.Controls.Panel 代替它,特别是网格吗?” - 你打赌。

“我将如何使用一个<Grid>元素作为 ListBox 中每个项目的模板?” - 与在其他任何地方使用 Grid 的方式相同。没有什么不同;只是 ItemsControl(及其后代 ListBox)将创建您的 Grid 的多个实例。但是请注意,在 ItemTemplate 中,您的 DataContext 将是当前列表项,因此您{Binding}的 s 将相对于该列表项(除非您使用例如 ElementName 另行指定)。

“这看起来对吗?” - 这确实应该作为一个单独的问题发布,因为它与有关 MSDN 示例的问题无关,而且我什至不确定您要做什么。但我会尝试回答:我怀疑有问题,因为您以两种不同的方式使用名称“GraphLabelYData”。在 ColumnDefinition 中,据我所知,您将 GraphLabelYData 视为 XAML 元素的名称(即,您正在使用Name="GraphLabelYData"or查找窗口/页面/UserControl 中的另一个控件x:Name="GraphLabelYData",并读取该控件的 GraphLabelMarkerLength 属性);但在 TextBlock 中,您将 GraphLabelYData 视为当前集合项的属性名称。我怀疑其中一个是不对的。

于 2009-06-22T22:24:21.407 回答