Domanda

Questo è un esempio di codice XAML preso da articolo della libreria MSDN per la proprietà 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>  

Sto cercando una spiegazione dell'uso dell'elemento <StackPanel> in questo esempio.
- gt &;
Dove si troverà questo pannello nel ListBox?
Qual è il suo scopo nel ItemTemplate?
Qualsiasi System.Windows.Controls.Panel può essere utilizzato al suo posto, in particolare una griglia?
Come farei usando un elemento <Grid> come modello per ciascun elemento in ListBox?

Ecco il concetto che sto cercando:

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

Ho disegnato il grafico usando un elemento <Path> e non ci sono problemi.

Sto lavorando sulle etichette per gli assi e sto sperimentando l'uso di un elemento <=> in ItemTemplate - ma non ho idea di come dovrebbe funzionare la griglia in questo contesto e MSDN non dice nulla sul pannello nel loro codice di esempio.

Il mio XAML per le etichette dell'asse Y attualmente appare così:

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

Sembra corretto? Non viene visualizzato nulla in fase di esecuzione, ma desidero assicurarmi che XAML sia modellato correttamente prima di iniziare il debug dei data-binding e del code-behind.

È stato utile?

Soluzione

" Dove si troverà questo pannello nella ListBox? " - La casella di riepilogo ne farà una copia per ogni elemento dell'elenco, ovvero uno per ciascun elemento nella raccolta myTodoList. Quindi all'interno di ciascun elemento dell'elenco, le tre etichette saranno sovrapposte una sopra l'altra.

" Qual è il suo scopo in ItemTemplate? " - Per rendere possibile mostrare più di un controllo per ogni elemento nell'Articolo Articoli. ItemTemplate, come molte altre cose in WPF, può accettare solo un elemento figlio, quindi se vuoi più figli, devi specificare come vuoi che siano disposti, e lo fai aggiungendo un pannello (StackPanel in questo caso).

" È possibile utilizzare qualsiasi System.Windows.Controls.Panel al suo posto, in particolare una griglia? " - Puoi scommettere.

" Come potrei fare usando un elemento <Grid> come modello per ogni elemento in ListBox? " - Allo stesso modo in cui useresti una griglia altrove. Non è diverso; è solo che ItemsControl (e il suo discendente, ListBox) creeranno più istanze della tua griglia. Si noti, tuttavia, che all'interno di ItemTemplate, DataContext sarà l'elemento di elenco corrente e pertanto i {Binding} saranno relativi a tale elemento di elenco (a meno che non si specifichi diversamente con ad esempio ElementName).

" Questo sembra corretto? " - Questo dovrebbe davvero essere pubblicato come una domanda separata, in quanto non è correlato alle domande sull'esempio MSDN e non sono nemmeno sicuro di cosa stai cercando di fare. Ma proverò a rispondere: sospetto che qualcosa non vada, perché stai usando il nome & Quot; GraphLabelYData & Quot; due modi diversi. In ColumnDefinition, per quanto ne so, stai trattando GraphLabelYData come il nome di un elemento XAML (cioè stai cercando un altro controllo nella finestra / pagina / UserControl con Name="GraphLabelYData" o x:Name="GraphLabelYData" e stai leggendo proprietà GraphLabelMarkerLength di quel controllo); ma in TextBlock, stai trattando GraphLabelYData come il nome di una proprietà sull'elemento della raccolta corrente. Sospetto che uno di quelli non sia giusto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top