Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Saiba como criar uma exibição mestre/detalhes de vários níveis de dados hierárquicos no WinUI associando controles de itens a instâncias collectionViewSource . Este artigo explica como usar a extensão de marcação {x:Bind} para melhorar o desempenho e a extensão de marcação {Binding} quando for necessária flexibilidade.
Uma estrutura comum para aplicativos WinUI é navegar até páginas de detalhes diferentes quando um usuário faz uma seleção em uma lista mestra. Essa estrutura é útil quando você deseja fornecer uma representação visual avançada de cada item em todos os níveis em uma hierarquia. Outra opção é exibir vários níveis de dados em uma única página. Essa estrutura é útil quando você deseja exibir algumas listas simples que permitem que o usuário faça uma busca detalhada rapidamente em um item de interesse. Este artigo descreve como implementar essa interação. As instâncias CollectionViewSource acompanham a seleção atual em cada nível hierárquico.
Você cria uma exibição de uma hierarquia de equipes esportivas organizada em listas para ligas, divisões e equipes e inclui uma exibição de detalhes da equipe. Quando você seleciona um item de qualquer lista, os modos de exibição subsequentes são automaticamente atualizados.
Dica
Confira também Exemplo de UWP de mestre/detalhes.
Pré-requisitos
Este artigo pressupõe que você saiba como criar um aplicativo WinUI básico. Para obter instruções sobre como criar seu primeiro aplicativo WinUI, consulte Criar um aplicativo WinUI.
Criar o projeto
Crie um projeto Aplicativo em branco empacotado (WinUI 3 na Área de Trabalho). Chame-o de "MasterDetailsBinding".
Criar o modelo de dados
Adicione uma classe ao projeto, chame-a de ViewModel.cs e adicione esse código a ela. Essa classe é sua classe de origem de associação.
using System.Collections.Generic;
using System.Linq;
namespace MasterDetailsBinding
{
public class Team
{
public string Name { get; set; }
public int Wins { get; set; }
public int Losses { get; set; }
}
public class Division
{
public string Name { get; set; }
public IEnumerable<Team> Teams { get; set; }
}
public class League
{
public string Name { get; set; }
public IEnumerable<Division> Divisions { get; set; }
}
public class LeagueList : List<League>
{
public LeagueList()
{
AddRange(GetLeague().ToList());
}
public IEnumerable<League> GetLeague()
{
return from x in Enumerable.Range(1, 2)
select new League
{
Name = "League " + x,
Divisions = GetDivisions(x).ToList()
};
}
public IEnumerable<Division> GetDivisions(int x)
{
return from y in Enumerable.Range(1, 3)
select new Division
{
Name = string.Format("Division {0}-{1}", x, y),
Teams = GetTeams(x, y).ToList()
};
}
public IEnumerable<Team> GetTeams(int x, int y)
{
return from z in Enumerable.Range(1, 4)
select new Team
{
Name = string.Format("Team {0}-{1}-{2}", x, y, z),
Wins = 25 - (x * y * z),
Losses = x * y * z
};
}
}
}
Criar o modo de exibição
Em seguida, exponha a classe de origem de associação na classe que representa a página de marcação. Adicione uma propriedade do tipo LeagueList ao MainWindow.
namespace MasterDetailsBinding
{
public sealed partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ViewModel = new LeagueList();
}
public LeagueList ViewModel { get; set; }
}
}
Por fim, substitua o conteúdo do arquivo MainWindow.xaml pela marcação a seguir. Essa marcação declara três instâncias collectionViewSource e as associa em uma cadeia. Os controles subsequentes podem então ser associados ao CollectionViewSource apropriado, dependendo do seu nível na hierarquia.
<Window
x:Class="MasterDetailsBinding.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MasterDetailsBinding"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid>
<Grid.Resources>
<CollectionViewSource x:Name="Leagues"
Source="{x:Bind ViewModel}"/>
<CollectionViewSource x:Name="Divisions"
Source="{Binding Divisions, Source={StaticResource Leagues}}"/>
<CollectionViewSource x:Name="Teams"
Source="{Binding Teams, Source={StaticResource Divisions}}"/>
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="15"/>
<Setter Property="FontWeight" Value="Bold"/>
</Style>
<Style TargetType="ListBox">
<Setter Property="FontSize" Value="15"/>
</Style>
<Style TargetType="ContentControl">
<Setter Property="FontSize" Value="15"/>
</Style>
</Grid.Resources>
<StackPanel Orientation="Horizontal">
<!-- All Leagues view -->
<StackPanel Margin="5">
<TextBlock Text="All Leagues"/>
<ListBox ItemsSource="{Binding Source={StaticResource Leagues}}"
DisplayMemberPath="Name"/>
</StackPanel>
<!-- League/Divisions view -->
<StackPanel Margin="5">
<TextBlock Text="{Binding Name, Source={StaticResource Leagues}}"/>
<ListBox ItemsSource="{Binding Source={StaticResource Divisions}}"
DisplayMemberPath="Name"/>
</StackPanel>
<!-- Division/Teams view -->
<StackPanel Margin="5">
<TextBlock Text="{Binding Name, Source={StaticResource Divisions}}"/>
<ListBox ItemsSource="{Binding Source={StaticResource Teams}}"
DisplayMemberPath="Name"/>
</StackPanel>
<!-- Team view -->
<ContentControl Content="{Binding Source={StaticResource Teams}}">
<ContentControl.ContentTemplate>
<DataTemplate>
<StackPanel Margin="5">
<TextBlock Text="{Binding Name}"
FontSize="15" FontWeight="Bold"/>
<StackPanel Orientation="Horizontal" Margin="10,10">
<TextBlock Text="Wins:" Margin="0,0,5,0"/>
<TextBlock Text="{Binding Wins}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="10,0">
<TextBlock Text="Losses:" Margin="0,0,5,0"/>
<TextBlock Text="{Binding Losses}"/>
</StackPanel>
</StackPanel>
</DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>
</StackPanel>
</Grid>
</Window>
Ao fazer vinculações diretamente ao CollectionViewSource, isso implica que você deseja vincular ao item atual em vinculações onde o caminho não pode ser encontrado na própria coleção. Você não precisa especificar a CurrentItem propriedade como o caminho para a associação, embora possa adicioná-la se houver alguma ambiguidade. Por exemplo, o No entanto, os controles no DataTemplate são associados a propriedades da classe Team porque o CollectionViewSource fornece automaticamente a equipe selecionada no momento na lista de equipes, quando necessário.
Confira também
Windows developer