Pregunta

Esta es una muestra de código XAML tomada de Artículo de la biblioteca de MSDN para la propiedad ItemsControl.ItemTemplate:

<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>  

Estoy buscando una explicación del uso del elemento <StackPanel> en este ejemplo.
- >
¿Dónde va a existir este panel en ListBox?
¿Cuál es su propósito en ItemTemplate?
¿Se puede usar cualquier System.Windows.Controls.Panel en su lugar, específicamente una Grid?
¿Cómo haría para usar un elemento <Grid> como plantilla para cada elemento en ListBox?

Aquí está el concepto que busco:

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

He dibujado el gráfico usando un elemento <Path>, y no hay problemas allí.

Estoy trabajando en las etiquetas para los ejes, y estoy experimentando con el uso de un elemento <=> en ItemTemplate, pero no tengo idea de cómo se supone que funciona la cuadrícula en este contexto, y MSDN no dice nada sobre el panel en su código de muestra.

Mi XAML para las etiquetas del eje Y actualmente se ve así:

<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>  

¿Esto parece correcto? No aparece nada en tiempo de ejecución, pero quiero asegurarme de que el XAML esté modelado correctamente antes de comenzar a depurar los enlaces de datos y el código subyacente.

¿Fue útil?

Solución

" ¿Dónde va a existir este panel en el ListBox? " - El cuadro de lista hará una copia para cada elemento de la lista, es decir, uno para cada elemento de la colección myTodoList. Entonces, dentro de cada elemento de la lista, tendrá las tres etiquetas apiladas una encima de la otra.

" ¿Cuál es su propósito en ItemTemplate? " - Para que sea posible mostrar más de un control para cada elemento en ItemsSource. ItemTemplate, como muchas cosas en WPF, solo puede tomar un elemento hijo, por lo que si desea varios hijos, debe especificar cómo desea que se distribuyan, y lo hace agregando un panel (StackPanel en este caso).

" ¿Se puede usar cualquier System.Windows.Controls.Panel en su lugar, específicamente un Grid? " - Puedes apostar.

" ¿Cómo haría para usar un elemento <Grid> como plantilla para cada elemento en el ListBox? " - De la misma manera que usarías una Grid en cualquier otro lugar. No es diferente; es solo que ItemsControl (y su descendiente, ListBox) creará múltiples instancias de su Grid. Sin embargo, tenga en cuenta que dentro de ItemTemplate, su DataContext será el elemento de la lista actual y, por lo tanto, sus {Binding} s serán relativos a ese elemento de la lista (a menos que especifique lo contrario con, por ejemplo, ElementName).

" ¿Parece correcto? " - Esto realmente debería publicarse como una pregunta separada, ya que no está relacionada con las preguntas sobre la muestra de MSDN, y ni siquiera estoy seguro de lo que está tratando de hacer. Pero intentaré responder: sospecho que algo está mal, porque estás usando el nombre & Quot; GraphLabelYData & Quot; Dos formas diferentes. En ColumnDefinition, por lo que puedo decir, estás tratando GraphLabelYData como el nombre de un elemento XAML (es decir, estás buscando otro control en la ventana / página / UserControl con Name="GraphLabelYData" o x:Name="GraphLabelYData", y leyendo la propiedad GraphLabelMarkerLength de ese control); pero en TextBlock, está tratando GraphLabelYData como el nombre de una propiedad en el elemento de la colección actual. Sospecho que uno de esos no está bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top