Question

Ceci est un exemple de code XAML provenant de Article de bibliothèque MSDN pour la propriété 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 sur l'utilisation de l'élément <StackPanel> dans cet exemple.
- >
Où ce panneau va-t-il exister dans le contrôle ListBox?
Quel est son but dans ItemTemplate?
Peut-on utiliser n'importe quel System.Windows.Controls.Panel à sa place, en particulier une grille?
Comment pourrais-je utiliser un élément <Grid> comme modèle pour chaque élément du ListBox?

Voici le concept pour lequel je vais:

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

J'ai tracé le graphique à l'aide d'un élément <Path> et il n'y a pas de problèmes.

Je travaille sur les étiquettes pour les axies et j'essaye d'utiliser un élément <=> dans ItemTemplate - mais je ne sais pas du tout comment la grille est censée fonctionner dans ce contexte, et MSDN ne dit rien. sur le panneau dans leur exemple de code.

Mon XAML pour les étiquettes de l'axe des ordonnées 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 cela semble correct? Rien ne s'affiche à l'exécution, mais je veux m'assurer que le XAML est correctement modélisé avant de commencer à déboguer les liaisons de données et le code-behind.

Était-ce utile?

La solution

& "Où ce panneau va-t-il exister dans le contrôle ListBox? &"; - La liste déroulante en fera 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, vous aurez les trois étiquettes empilées les unes sur les autres.

& "Quel est son but dans le ItemTemplate? &"; - Permettre d'afficher plus d'un contrôle pour chaque élément dans la source d'articles. ItemTemplate, comme beaucoup d'autres choses dans WPF, ne peut prendre qu'un seul élément enfant. Par conséquent, si vous souhaitez plusieurs enfants, vous devez spécifier la manière dont vous souhaitez les mettre en forme, et vous le faites en ajoutant un panneau (StackPanel dans ce cas).

& "Peut-on utiliser n'importe quel System.Windows.Controls.Panel à sa place, en particulier une grille? &"; - Vous pariez.

& "Comment utiliser un élément <Grid> en tant que modèle pour chaque élément du ListBox? &"; - De la même manière que vous utiliseriez une grille n'importe où ailleurs. Ce n'est pas différent c'est simplement que ItemsControl (et son descendant, ListBox) va créer plusieurs instances de votre grille. Notez cependant qu'à l'intérieur de ItemTemplate, votre DataContext sera l'élément de liste actuel et que, par conséquent, vos {Binding} s seront relatifs à cet élément de liste (sauf indication contraire avec ElementName, par exemple).

& "Cela a-t-il l'air correct? &"; - Cela devrait vraiment être posté en tant que question distincte, car elle n’est pas liée aux questions relatives à l’exemple 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, car vous utilisez le nom & "GraphLabelYData &"; deux manières différentes. Autant que je sache, dans ColumnDefinition, vous traitez GraphLabelYData comme le nom d’un élément XAML (c’est-à-dire que vous recherchez un autre contrôle dans la fenêtre / page / UserControl avec Name="GraphLabelYData" ou x:Name="GraphLabelYData" et lisez 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 la collection en cours. Je soupçonne que l’un d’eux n’est pas juste

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top