Pergunta

Este é um exemplo de código XAML retirado do MSDN artigo biblioteca para a propriedade 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>  

Eu estou procurando uma explicação sobre o uso do elemento <StackPanel> é este exemplo.
->
Onde está este painel vai existir na caixa de listagem?
Qual é o seu propósito na ItemTemplate?
Pode qualquer System.Windows.Controls.Panel ser usado em seu lugar, especificamente um Grid?
Como eu iria sobre como usar um elemento <Grid> como modelo para cada item na caixa de listagem?

Aqui é o conceito que eu estou indo para:

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

Eu tirei o gráfico usando um elemento <Path>, e não há problemas.

Eu estou trabalhando sobre os rótulos para as axies, e eu estou experimentando com o uso de um elemento <Grid> no ItemTemplate - mas não tenho idéia de como a grade é suposto função neste contexto, e MSDN não diz nada sobre o painel no seu código de exemplo.

Meu XAML para os rótulos do eixo Y atualmente se parece com isso:

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

Será que este olhar correto? Nada aparece em tempo de execução, mas eu quero ter certeza que o XAML é modelado corretamente antes de iniciar a depuração do-ligações de dados eo código-behind.

Foi útil?

Solução

"Onde está este painel vai existir na caixa de listagem?" - A caixa de listagem vai fazer uma cópia para cada item da lista, ou seja, um para cada elemento na coleção myTodoList. Então, dentro de cada item da lista, você terá as três rótulos empilhados um sobre o outro.

"O que é seu propósito na ItemTemplate?" - Para torná-lo possível mostrar mais de um controle para cada elemento no ItemsSource. ItemTemplate, como muitas coisas na WPF, só pode ter um elemento filho, então se você quiser vários filhos, você precisa especificar como você quer que eles colocado para fora, e você faz isso através da adição de um painel (StackPanel, neste caso).

"Pode qualquer System.Windows.Controls.Panel ser usado em seu lugar, especificamente um Grid?" - Pode apostar

.

"Como eu iria sobre usando um elemento <Grid> como modelo para cada item na caixa de listagem?" - Da mesma forma que você usaria uma grade em qualquer outro lugar. Não é diferente; é só que ItemsControl (e seu descendente, ListBox) vai criar várias instâncias de sua grade. Note, porém, que dentro do ItemTemplate, seu DataContext será o item da lista atual e, portanto, seus {Binding}s será em relação a esse item da lista (a menos que você especifique o contrário, com por exemplo ElementName).

"Será que este olhar correto?" - Isso realmente deve ser postado como uma questão separada, como é relacionado com as perguntas sobre a amostra MSDN, e eu nem tenho certeza que você está tentando fazer. Mas eu vou tentar responder: Eu suspeito que algo está errado, porque você está usando o nome de "GraphLabelYData" duas maneiras diferentes. No ColumnDefinition, tanto quanto eu posso dizer, você está tratando GraphLabelYData como o nome de um elemento XAML (ou seja, você está procurando outro controle na janela / page / UserControl com Name="GraphLabelYData" ou x:Name="GraphLabelYData", e ler propriedade GraphLabelMarkerLength desse controle ); mas no TextBlock, você está tratando GraphLabelYData como o nome de uma propriedade no item de coleção atual. Eu suspeito que um daqueles não está certo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top