2009-06-22 6 views
0

Ceci est un exemple de code XAML pris du MSDN library article pour la propriété ItemsControl.ItemTemplate:Que fait cet exemple de code MSDN? - 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> 

Je cherche une explication de l'utilisation de l'élément est <StackPanel> cet exemple.
->
Où ce panneau va-t-il exister dans la ListBox?
Quel est son rôle dans ItemTemplate?
Peut-on utiliser un System.Windows.Controls.Panel à sa place, en particulier une grille?
Comment utiliser un élément <Grid> comme modèle pour chaque élément de la ListBox?

Voici le concept que je vais faire:

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

J'ai dessiné le graphique en utilisant un élément <Path>, et il n'y a pas de problèmes. Je travaille sur les étiquettes pour les axies, et j'expérimente l'utilisation d'un élément <Grid> dans le ItemTemplate - mais je ne sais pas comment la grille est censée fonctionner dans ce contexte, et MSDN ne dit rien à propos de le panneau dans leur exemple de code.

Mon XAML pour les étiquettes de l'axe Y ressemble actuellement à ceci:

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

Est-ce que ce regard correct? Rien ne s'affiche au moment de l'exécution, mais je veux m'assurer que le XAML est modélisé correctement avant de débuter le débogage des liaisons de données et du code-behind.

+0

Ceci est l'une des raisons pour lesquelles j'aime XAML/WPF - vous pouvez faire des trucs * vraiment * fous dans un contrôle si vous voulez .... –

+0

Trop de questions ici - Je ne sais pas par où commencer ... –

Répondre

4

"Où ce panneau va-t-il exister dans le ListBox?" - La zone de liste en crée une copie pour chaque élément de la liste, c'est-à-dire une pour chaque élément de la collection myTodoList. Ainsi, dans chaque élément de la liste, les trois étiquettes seront empilées l'une au-dessus de l'autre.

"Quel est son objectif dans ItemTemplate?" - Pour permettre d'afficher plus d'un contrôle pour chaque élément dans ItemsSource. ItemTemplate, comme beaucoup de choses dans WPF, ne peut prendre qu'un seul élément enfant, donc si vous voulez plusieurs enfants, vous devez spécifier comment vous voulez les disposer, et vous faites cela en ajoutant un panneau (StackPanel dans ce cas).

"Peut-on utiliser un System.Windows.Controls.Panel à sa place, en particulier une grille?" - Tu paries. "Comment utiliser un élément <Grid> comme modèle pour chaque élément de la ListBox?" - De la même manière que vous utiliseriez une grille ailleurs. Ce n'est pas différent. c'est juste que ItemsControl (et son descendant, ListBox) va créer plusieurs instances de votre Grid. Notez, cependant, qu'à l'intérieur du ItemTemplate, votre DataContext sera l'élément de liste en cours, et donc vos {Binding} seront relatifs à cet élément de liste (sauf si vous spécifiez autrement avec, par exemple, ElementName).

"Cela vous semble-t-il correct?" - Cela devrait vraiment être posté comme une question distincte, car il n'est pas lié aux questions sur l'échantillon MSDN, et je ne suis même pas sûr de ce que vous essayez de faire. Mais je vais essayer de répondre: je soupçonne que quelque chose ne va pas, parce que vous utilisez le nom "GraphLabelYData" de deux manières différentes. Dans la ColumnDefinition, autant que je peux dire, vous traitez GraphLabelYData comme le nom d'un élément XAML (ie.vous recherchez un autre contrôle dans la fenêtre/page/UserControl avec Name="GraphLabelYData" ou x:Name="GraphLabelYData", et en lisant la propriété GraphLabelMarkerLength de ce contrôle); mais dans le TextBlock, vous traitez GraphLabelYData comme le nom d'une propriété sur l'élément de collection actuel. Je soupçonne que l'un d'eux n'a pas raison.

+4

Merci beaucoup! Je savais qu'il y avait au moins une personne qui accepterait toutes ces questions. J'aime penser que la dernière question était liée - mais peut-être pas si clairement. J'étais préoccupé par l'utilisation d'un élément de panneau dans un modèle. Et je n'avais aucune idée si j'utilisais la Grille pour la même raison que le StackPanel était utilisé dans l'échantillon, ou s'il faisait même la même chose. En ce qui concerne les reliures, vous évoquez un point intéressant. – Giffyguy

+4

Cependant, je suis confus car je n'utilise pas GraphLabelYData dans le TextBox. J'utilise GraphLabelTag qui est une propriété de l'élément de collection actuel (GraphLabelYData est la collection en question, avec quelques propriétés personnalisées de ma création, telles que GraphLabelMarkerLength). – Giffyguy

+4

Maintenant, ça commence à déraper un peu - je n'avais pas l'intention de poser des questions sur les liaisons de données ... Vous m'avez trouvé, haha. Êtes-vous prêt à m'aider avec les fixations si je leur explique un peu plus complètement? – Giffyguy

Questions connexes