A maior parte dos dados são formados por uma coleção de dados do mesmo tipo.
Nesta aula vamos aprender a exibir uma lista de dados para o usuário e também permitir ao usuário interagir.
Primeiro vamos definir o tipo de dado que aparecerá na lista.
Vamos implementar a classe Pessoa
namespace WpfAppListBoxTest {
public class Pessoa {
public Pessoa(string aNome, int aIdade) {
this.Nome = aNome;
this.Idade = aIdade;
}
public string Nome { get; set; }
public int Idade { get; set; }
public override string ToString() {
return $"Nome: {Nome}, Idade: {Idade}";
}
}
}
No xaml
vamos criar uma lista dentro do grid
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="10"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="10"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="10"/>
</Grid.RowDefinitions>
<ListBox x:Name="ListBoxPessoas"
Grid.Row="1" Grid.Column="1">
</ListBox>
</Grid>
Agora no C#
vamos ligar a lista chamada ListBoxPessoas
com uma lista populada por objetos da classe Pessoa
public partial class MainWindow : Window {
public List<Pessoa> Pessoas = new List<Pessoa>() {
new Pessoa("Ana", 21 ),
new Pessoa("Beto", 22 ),
new Pessoa("Carla", 23 ),
new Pessoa("Davi", 24 ),
};
public MainWindow() {
InitializeComponent();
// Aqui definimos como fonte da ListBox
// da lista pessoas
ListBoxPessoas.ItemsSource = Pessoas;
}
}
Agora vamos interagir com a lista escolhendo um dos itens.
A ideia do próximo programa é que vamos selecionar um item e passar o item selecionado para o código C#
.
Para isto vamos criar um botão, que depois de pressionado irá criar uma MessageBox
mostrando o item selecionado.
Modifique a interface para termos um botão:
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="10"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="10"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="10"/>
</Grid.RowDefinitions>
<ListBox x:Name="ListBoxPessoas"
Grid.Row="1" Grid.Column="1">
</ListBox>
<Button Content="Aperte" Click="OnMostrarClicked"
Grid.Column="1" Grid.Row="3"/>
</Grid>
Agora vamos implementar a função do botão
public partial class MainWindow : Window {
public List<Pessoa> Pessoas = new List<Pessoa>() {
new Pessoa("Ana", 21 ),
new Pessoa("Beto", 22 ),
new Pessoa("Carla", 23 ),
new Pessoa("Davi", 24 ),
};
public MainWindow() {
InitializeComponent();
ListBoxPessoas.ItemsSource = Pessoas;
}
private void OnMostrarClicked(object sender, RoutedEventArgs e) {
// Esta linha pega o objeto selecionado
Pessoa p = (Pessoa)ListBoxPessoas.SelectedItem;
if(p != null)
MessageBox.Show(p.ToString());
else
MessageBox.Show("Selecione um item");
}
}
Existe também a opção de escolher mais de um item na lista.
Teremos que modificar o código do xaml
para que seja possível escolher mais de um item na lista, basta adicionar a propriedade SelectionMode="Multiple"
na ListBox
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="10"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="10"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="10"/>
</Grid.RowDefinitions>
<ListBox x:Name="ListBoxPessoas" SelectionMode="Multiple"
Grid.Row="1" Grid.Column="1">
</ListBox>
<Button Content="Aperte" Click="OnMostrarClicked"
Grid.Column="1" Grid.Row="3"/>
</Grid>
Agora ao invés de usar ListBoxPessoas.SelectedItem
usaremos ListBoxPessoas.SelectedItems
que retorna uma lista de objetos.
public partial class MainWindow : Window {
public List<Pessoa> Pessoas = new List<Pessoa>() {
new Pessoa("Ana", 21 ),
new Pessoa("Beto", 22 ),
new Pessoa("Carla", 23 ),
new Pessoa("Davi", 24 ),
};
public MainWindow() {
InitializeComponent();
ListBoxPessoas.ItemsSource = Pessoas;
}
private void OnMostrarClicked(object sender, RoutedEventArgs e) {
IList selectedItens = ListBoxPessoas.SelectedItems;
foreach (Pessoa person in selectedItens) {
MessageBox.Show(person.ToString());
}
}
}
Usar o método ToString
serve apenas para o desenvolvedor debugar o programa, não é para mostrar para o usuário.
Vamos aprender a mostrar o objeto Pessoa
de uma forma mais bonita para o usuário final.
Na ListBox
vamos configurar como cada item deve aparecer, isto deve ser feito dentro de um DataTemplate
que estará dentro de um ListBox.ItemTemplate
.
Dentro do DataTemplate
podemos fazer um layout com TextBlock
fazendo o bind dos atributos dos objetos.
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="10"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="10"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="10"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="10"/>
</Grid.RowDefinitions>
<ListBox x:Name="ListBoxPessoas" SelectionMode="Multiple"
Grid.Row="1" Grid.Column="1">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Nome, StringFormat='Nome: {0}'}"/>
<TextBlock Text="{Binding Idade, StringFormat='Idade: {0}'}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button Content="Aperte" Click="OnMostrarClicked"
Grid.Column="1" Grid.Row="3"/>
</Grid>