Exibir dados de dois níveis abaixo
-
21-12-2019 - |
Pergunta
Eu tenho as seguintes classes, que contêm ObservableCollections do próximo nível abaixo:
Draw
ObservableCollection<Round>();
Round
ObservableCollection<Formation>();
Formation
Então um Empate é composto por Rodadas, as Rodadas são compostas por Formações.
Tenho uma página que possui um botão para criar sorteio aleatório, atualmente estou chamando outra classe que retorna sorteio:
this.defaultViewModel[DrawName] = RandomDraw.generate();
Não estou tendo problemas para vincular um ListView a Rounds e exibir informações de rodadas, mas como faço para exibir as formações individuais?Isso é o que estou fazendo atualmente, não esperava poder apenas exibir coisas vinculando-se a Formações, mas como faço para acessá-lo?
<ListView
ItemsSource="{Binding Rounds}"
IsItemClickEnabled="True"
ItemClick="ItemView_ItemClick"
ContinuumNavigationTransitionInfo.ExitElementContainer="True">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,0,0,9.5">
<TextBlock
Text="{Binding RoundNumber}"
TextWrapping="Wrap"
Pivot.SlideInAnimationGroup="1"
CommonNavigationTransitionInfo.IsStaggerElement="True"
Style="{ThemeResource ListViewItemTextBlockStyle}"
Margin="0,0,19,0"/>
<TextBlock
Text="{Binding Formations}"
TextWrapping="WrapWholeWords"
Pivot.SlideInAnimationGroup="2"
CommonNavigationTransitionInfo.IsStaggerElement="True"
Style="{ThemeResource ListViewItemContentTextBlockStyle}"
Margin="0,0,19,0"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Solução
Você deve dar uma olhada nos modelos de dados hierárquicos, que são usados pelo controle TreeView do WPF em vez de ListViews.Eles são uma escolha natural para mostrar dados hierárquicos.Claro, como qualquer controle WPF, você pode personalizar completamente sua aparência usando estilos e modelos.Aqui estão algumas boas referências:
MSDN Como fazer:Use um TreeView para exibir dados hierárquicos
Ligação de dados hierárquica no WPF
No entanto, se você quiser continuar usando ListViews, uma maneira de fazer isso é aninhar outro controle de contêiner dentro do ListVIew pai.ObservableCollections são processados automaticamente por elementos específicos do WPF, como Panels.No seu exemplo, você pode substituir o segundo TextBlock por outro ListView, com um ItemTemplate semelhante ao primeiro.Também pode ser qualquer elemento Panel semelhante a uma coleção, como StackPanel.
<ListView
ItemsSource="{Binding Rounds}"
IsItemClickEnabled="True"
ItemClick="ItemView_ItemClick"
ContinuumNavigationTransitionInfo.ExitElementContainer="True">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,0,0,9.5">
<TextBlock
Text="{Binding RoundNumber}"
TextWrapping="Wrap"
Pivot.SlideInAnimationGroup="1"
CommonNavigationTransitionInfo.IsStaggerElement="True"
Style="{ThemeResource ListViewItemTextBlockStyle}"
Margin="0,0,19,0"/>
<!-- CHANGED CODE HERE -->
<ListView
ItemsSource="{Binding Formations}"
...>
<ListView.ItemTemplate>...</ListView.ItemTemplate>
</ListView>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>