Vinculação de dados e listas
Até agora, você só usou a vinculação de dados para exibir e editar as propriedades de um único objeto. Nesta lição, você aplicará conceitos de vinculação de dados para exibir uma coleção de objetos. Para simplificar, esses objetos serão cores. Mais especificamente, serão várias instâncias da ColorDescriptor
classe.
1. Crie a ColorDescriptor
classe
Vamos criar uma classe para representar uma cor. Clique com o botão direito do mouse no projeto no Gerenciador de Soluções, selecione Adicionar / Classe e insira ColorDescriptor
como o DatabindingSample
nome da classe. Selecione Adicionar para criar a classe.
ColorDescriptor
Contém duas propriedades: a própria cor como um objeto e um Windows.UI.Color
nome de cor. Ele também tem um construtor que preenche essas propriedades, um ToString()
método que exibe o nome da cor e valores hexadecimais para os componentes de cor R, G e B. Aqui está a aula inteira ColorDescriptor
.
using Windows.UI;
namespace DatabindingSample
{
public class ColorDescriptor : ObservableObject
{
public ColorDescriptor(Color color, string name)
{
Color = color;
Name = name;
}
public Color Color { get; private set; }
public string Name { get; private set; }
public override string ToString()
{
return $"{Name} (#{Color.R:X2}{Color.G:X2}{Color.B:X2})";
}
}
}
Substitua o conteúdo padrão do arquivo ColorDescriptor.cs pelo código anterior.
2. Crie a página ColorList.xaml
Para exibir a lista de cores, usaremos uma nova página XAML. Clique com o botão direito do DatabindingSample
mouse no projeto no Gerenciador de Soluções e selecione Adicionar / Novo Item. Escolha Página em Branco na lista de itens disponíveis e insira ColorList
como o nome. Selecione Adicionar para criar a página.
3. Defina a página de inicialização
Agora, se você iniciar o aplicativo, ele será aberto com a página MainPage . Como você vai trabalhar com a página ColorList.xaml recém-criada, seria bom ter isso como a página inicial. Para que isso aconteça, abra App.xaml.cs e localize a linha que navega até MainPage.
rootFrame.Navigate(typeof(MainPage), e.Arguments);
Substitua por , e verifique se a página ColorList é iniciada quando você inicia o aplicativo (pressione F5 ou selecione Depurar / Iniciar Depuração).ColorList
MainPage
4. Crie a lógica para a lista de cores
Continuaremos a prática recomendada introduzida anteriormente de criar uma lógica separada para a nova página. Então, vá em frente e crie uma nova classe, chamada ColorListLogic
.
Clique com o botão direito do mouse no projeto no Gerenciador de Soluções, selecione Adicionar / Classe e digite ColorListLogic
como o DatabindingSample
nome da classe. Selecione Adicionar para criar a classe e cole o seguinte no arquivo:
using System.Collections.Generic;
using System.Collections.ObjectModel;
using Windows.UI;
namespace DatabindingSample
{
public class ColorListLogic : ObservableObject
{
public List<ColorDescriptor> LotsOfColors { get; private set; }
public ColorListLogic()
{
LotsOfColors = new List<ColorDescriptor>
{
new ColorDescriptor(Colors.Red, "red"),
new ColorDescriptor(Colors.White, "white"),
new ColorDescriptor(Colors.Green, "green"),
new ColorDescriptor(Colors.Yellow, "yellow"),
new ColorDescriptor(Colors.Blue, "blue"),
new ColorDescriptor(Colors.Black, "black")
};
}
}
}
A ColorListLogic
aula é muito simples (por enquanto). Tem uma propriedade chamada LotsOfColors
, que é um List
dos ColorDescriptor
objetos. A lista é preenchida com algumas cores no construtor da classe. E já está!
5. Exiba as cores em um ListBox
O próximo passo é exibir as cores em nosso aplicativo. Primeiro, vamos tornar o acessível a ColorListLogic
partir de XAML. ColorList.xaml.cs
Abra e adicione isso à ColorList
classe:
public ColorListLogic Logic { get; } = new ColorListLogic();
Estamos usando aqui a mesma sintaxe que usamos anteriormente MainPageLogic
. Ele cria uma propriedade get-only e inicializa seu valor para um objeto recém-criado ColorListLogic
.
Em seguida, abra ColorList.xaml e adicione o seguinte XAML dentro do Grid
elemento .
<ListBox ItemsSource="{x:Bind Logic.LotsOfColors}"
Margin="20"
Width="200"
HorizontalAlignment="Left"
VerticalAlignment="Top"/>
A parte interessante aqui é o ItemsSource
atributo. Como o nome sugere, ele fornece a origem dos itens exibidos no ListBox
. E está simplesmente ligado à ColorListLogic
propriedade do .LotsOfColors
Se você executar o aplicativo agora, ele mostra as cores em um ListBox
! Mas não é muito bom de se olhar. O ListBox
parece ter invocado o ToString()
ColorDescriptor
método do s armazenado na LotsOfColors
lista.
6. Defina um modelo para os itens
Seria bom ter um modelo que mostrasse a cor real armazenada na ColorDescriptor.Color
propriedade e seu nome. Algo assim:
Para codificar isso em XAML, podemos colocar um colorido Rectangle
e um em um StackPanel
TextBlock
arquivo .
<StackPanel Orientation="Horizontal">
<Rectangle Width="80" Height="20">
<Rectangle.Fill>
<SolidColorBrush Color="Blue"/>
</Rectangle.Fill>
</Rectangle>
<TextBlock Text="blue" Margin="20, 10, 0, 10"/>
</StackPanel>
Esse é um dos pontos fortes do XAML e da vinculação de dados. Quase todos os visuais complexos são baseados em modelos que você pode redefinir. Para usar o precedente StackPanel
como um modelo, precisamos colocá-lo dentro de um DataTemplate
arquivo . A DataTemplate
precisa definir um DataType
, que é o tipo de dados ao qual o modelo pode ser aplicado. No nosso caso, é a ColorDescriptor
classe. Então, a DataTemplate
aparência é assim:
<DataTemplate x:DataType="local:ColorDescriptor">
<!-- template content comes here -->
</DataTemplate>
Como os dados são renderizados em um ListBox
(e muitos outros controles) é controlado pelo seu ItemTemplate
, que deve ser definido como o DataTemplate
. Existem várias formas de o fazer. Nesta lição, vamos simplesmente definir o DataTemplate
interior do ListBox
, com a seguinte sintaxe:
<ListBox ...>
<ListBox.ItemsSource>
<DataTemplate ...>
...
</DataTemplate>
</ListBox.ItemsSource>
</ListBox>
Mais tarde, você verá como um pode ser reutilizado em vários lugares, definindo-o como um DataTemplate
recurso.
Agora, o conjunto ListBox
tem esta aparência (se você não acompanhou, substitua a tag inteira <ListBox>
pelo seguinte XAML):
<ListBox ItemsSource="{x:Bind Logic.LotsOfColors}"
Margin="20"
Width="200"
HorizontalAlignment="Left"
VerticalAlignment="Top">
<ListBox.ItemTemplate>
<DataTemplate x:DataType="local:ColorDescriptor">
<StackPanel Orientation="Horizontal">
<Rectangle Width="80"
Height="20">
<Rectangle.Fill>
<SolidColorBrush Color="{x:Bind Color}"/>
</Rectangle.Fill>
</Rectangle>
<TextBlock Text="{x:Bind Name}"
Margin="20, 10, 0, 10"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Observe que, como cada item no ListBox
corresponde a um ColorDescriptor
objeto, você só precisa definir as associações dentro do modelo dentro do contexto dessa classe. O compilador até verifica se os Logic.LotsOfColors
objetos contémColorDescriptor
, e que ColorDescriptor.Name
ColorDescriptor.Color
existem e são do tipo certo.
7. Execute o aplicativo
Execute o aplicativo agora pressionando F5 ou selecionando Depurar / Iniciar Depuração no menu. Você deve ver a lista de cores em toda a sua glória.
Se você iniciar um aplicativo XAML no modo de depuração, poderá aproveitar a edição XAML ao vivo. Você nem precisa parar o aplicativo ou pressionar salvar. Basta alterar o XAML e a maioria das alterações é refletida instantaneamente no aplicativo em execução. Experimente agora. Altere o Width
e Height
do interior do modelo de dados para 30, transformando assim os retângulos de Rectangle
cor em quadrados.
Isso é chamado de XAML Hot Reload e pode ser útil para ajustar o layout e as animações em seu aplicativo.
Resumo
Esta lição mostrou os conceitos básicos da exibição de vários itens em um ListBox
arquivo . Existem outros controlos disponíveis para fins semelhantes, tais como ItemsControl
, ListView
e GridView
. Mas os princípios básicos são os mesmos: vincular sua lista (IEnumerable
, List<>
) de objetos à ItemsSource
propriedade e definir DataTemplates
para controlar como os itens de lista individuais são exibidos e se comportam. Você também pode redefinir o layout desses itens e até mesmo a aparência dos próprios controles de contêiner (embora isso esteja além do escopo deste módulo).
Note que o código nunca teve que lidar com o ListBox
próprio. Ele acabou de criar uma coleção de objetos de negócios (ColorDescriptor
), e o tempo de execução XAML se encarregou de expandir o modelo para cada item.
A próxima lição ilustra como você pode selecionar itens de uma ListBox
lista suspensa e alterar o conteúdo das listas do código para que a adição e a remoção de elementos sejam refletidas na interface do usuário.
Até agora, você só usou a vinculação de dados para exibir e editar as propriedades de um único objeto. Nesta lição, você aplicará conceitos de vinculação de dados para exibir uma coleção de objetos. Para simplificar, esses objetos serão cores. Mais especificamente, serão várias instâncias de uma ColorDescriptor
classe.
1. Crie a ColorDescriptor
classe
Vamos criar a classe para representar uma cor. Clique com o botão direito do mouse no projeto no Gerenciador de Soluções, selecione Adicionar / Classe e insira ColorDescriptor
como o DatabindingSampleWPF
nome da classe. Selecione Adicionar para criar a classe.
ColorDescriptor
Contém duas propriedades: a própria cor como um objeto e um System.Windows.Media.Color
nome de cor. Ele também tem um construtor que define essas propriedades, um ToString()
método que exibe o nome da cor e valores hexadecimais para os componentes de cor R, G e B. Aqui está a aula inteira ColorDescriptor
.
using System.Windows.Media;
namespace DatabindingSampleWPF
{
public class ColorDescriptor : ObservableObject
{
public ColorDescriptor(Color color, string name)
{
Color = color;
Name = name;
}
public Color Color { get; private set; }
public string Name { get; private set; }
public override string ToString()
{
return $"{Name} (#{Color.R:X2}{Color.G:X2}{Color.B:X2})";
}
}
}
Substitua ColorDescriptor.cs
o conteúdo padrão do arquivo pelo código anterior.
2. Crie a página ColorList.xaml
Para exibir a lista de cores, usaremos um novo arquivo XAML. Clique com o botão direito do DatabindingSampleWPF
mouse no projeto no Gerenciador de Soluções e selecione Adicionar / Novo Item. Escolha Janela (WPF) na lista de itens disponíveis e digite ColorList
como o nome. Selecione Adicionar para criar a página.
3. Defina o arquivo XAML de inicialização
Agora, se você iniciar o aplicativo, ele será aberto com MainWindow. Porque você vai trabalhar com o recém-criado ColorList.xaml
, seria bom ter essa exibição na inicialização. Para que isso aconteça, abra App.xaml
e localize o StratupUri
atributo do elemento raiz Application
.
StartupUri="MainWindow.xaml"
Substitua MainWindow
por ColorList
, e verifique se a ColorList é mostrada quando você inicia o aplicativo (pressione F5 ou selecione Depurar / Iniciar Depuração).
4. Crie o DataContext
para a lista de cores
Continuaremos a prática recomendada introduzida anteriormente de criar uma classe separada DataContext
para a nova janela XAML. Então, vamos em frente e criar uma nova classe, chamada ColorListDataContext
.
Clique com o botão direito do mouse no projeto no Gerenciador de Soluções, selecione Adicionar / Classe e digite ColorListDataContext
como o DatabindingSample
nome da classe. Selecione Adicionar para criar a classe e cole o seguinte no arquivo:
using System.Collections.ObjectModel;
using System.Collections.Generic;
using System.Windows.Media;
namespace DatabindingSampleWPF
{
public class ColorListDataContext: ObservableObject
{
public List<ColorDescriptor> LotsOfColors { get; private set; }
public ColorListDataContext()
{
LotsOfColors = new List<ColorDescriptor>
{
new ColorDescriptor(Colors.Red, "red"),
new ColorDescriptor(Colors.White, "white"),
new ColorDescriptor(Colors.Green, "green"),
new ColorDescriptor(Colors.Yellow, "yellow"),
new ColorDescriptor(Colors.Blue, "blue"),
new ColorDescriptor(Colors.Black, "black")
};
}
}
}
A ColorListDataContext
aula é muito simples (por enquanto). Tem uma propriedade chamada LotsOfColors
, que é um List
dos ColorDescriptor
objetos. A lista é preenchida com algumas cores no construtor da classe. E já está!
5. Exiba as cores em um ListBox
O próximo passo é exibir as cores em nosso aplicativo. Como antes, precisamos criar uma instância da ColorListDataContext
classe em ColorList.xaml
, e defini-la como a para toda a DataContext
janela. Abra o ColorList.xaml
e adicione logo após a <Window ...>
tag:
<Window.DataContext>
<local:ColorListDataContext/>
</Window.DataContext>
Você precisa compilar o código neste ponto, para que o designer XAML possa resolver a classe recém-definida ColorListDataContext
.
Em seguida, copie a seguinte marcação XAML dentro da <Grid>
tag :
<ListBox ItemsSource="{Binding LotsOfColors}"
Margin="20"
Width="200"
HorizontalAlignment="Left"
VerticalAlignment="Top"/>
A parte interessante aqui é o ItemsSource
atributo. Como o nome sugere, ele fornece a origem dos itens exibidos no ListBox
. E está simplesmente ligado à ColorListDataContext
propriedade do .LotsOfColors
Se você executar o aplicativo agora, ele mostra as cores em um ListBox
! Mas não é muito bom de se olhar. O ListBox
parece ter invocado o ToString()
ColorDescriptor
método do s armazenado na LotsOfColors
lista.
6. Defina um modelo para os itens
Seria bom ter um modelo que mostra a cor real armazenada na ColorDescriptor.Color
propriedade e seu nome. Algo assim:
Para codificar isso em XAML, podemos colocar um colorido Rectangle
e um em um StackPanel
TextBlock
arquivo .
<StackPanel Orientation="Horizontal">
<Rectangle Width="80" Height="20">
<Rectangle.Fill>
<SolidColorBrush Color="Blue"/>
</Rectangle.Fill>
</Rectangle>
<TextBlock Text="blue" Margin="20, 10, 0, 10"/>
</StackPanel>
Esse é um dos pontos fortes do XAML e da vinculação de dados. Quase todos os visuais complexos são baseados em modelos que você pode redefinir. Para usar o acima StackPanel
como um modelo, precisamos colocá-lo dentro de um DataTemplate
:
<DataTemplate>
<!-- template content comes here -->
</DataTemplate>
Como os dados são renderizados em um ListBox
(e muitos outros controles) é controlado pelo seu ItemTemplate
, que deve ser definido para o DataTemplate
acima. Existem várias formas de o fazer. Nesta lição, vamos simplesmente definir o DataTemplate
interior do ListBox
, com a seguinte sintaxe:
<ListBox ...>
<ListBox.ItemsSource>
<DataTemplate ...>
...
</DataTemplate>
</ListBox.ItemsSource>
</ListBox>
Mais tarde, você verá como um pode ser reutilizado em vários lugares, definindo-o como um DataTemplate
recurso.
Agora, a marcação para todo ListBox
tem esta aparência (se você não tiver acompanhado, substitua o elemento inteiro <ListBox>
pelo seguinte XAML):
<ListBox ItemsSource="{Binding LotsOfColors}"
Margin="20"
Width="200"
HorizontalAlignment="Left"
VerticalAlignment="Top">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Rectangle Width="80"
Height="20">
<Rectangle.Fill>
<SolidColorBrush Color="{Binding Color}"/>
</Rectangle.Fill>
</Rectangle>
<TextBlock Text="{Binding Name}"
Margin="20, 10, 0, 10"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Observe que, como cada item no ListBox
corresponde a um ColorDescriptor
objeto, você só precisa definir as associações dentro do modelo dentro do contexto dessa classe.
7. Execute o aplicativo
Você deve ver imediatamente a lista de cores no Visual Studio. Apenas para ter certeza, execute o aplicativo agora pressionando F5 ou selecionando Depurar / Iniciar Depuração no menu.
Se você iniciar um aplicativo XAML no modo de depuração, poderá aproveitar a edição XAML ao vivo. Você nem precisa parar o aplicativo ou pressionar salvar. Basta alterar o XAML e a maioria das alterações é refletida instantaneamente no aplicativo em execução. Experimente agora. Altere o Width
e Height
do interior do modelo de dados para 30, transformando assim os retângulos de Rectangle
cor em quadrados.
Isso é chamado de XAML Hot Reload e pode ser útil para ajustar o layout e as animações em seu aplicativo.
Resumo
Esta lição percorreu os conceitos básicos de exibição de vários itens em um ListBox
arquivo . Existem outros controlos disponíveis para fins semelhantes, tais como ItemsControl
, ListView
e GridView
. Mas os princípios básicos são os mesmos: vincular sua lista (IEnumerable
, List<>
) de objetos à ItemsSource
propriedade e definir um DataTemplate
para controlar como os itens de lista individuais são exibidos e se comportam. Você também pode redefinir o layout desses itens e até mesmo a aparência dos próprios controles de contêiner (embora isso esteja além do escopo deste módulo).
Observe que o código lógico nunca teve qualquer conhecimento do ListBox
controle. Ele acabou de criar uma coleção de objetos de negócios (ColorDescriptor
), e o tempo de execução XAML lidou com a renderização do modelo para cada item.
A próxima lição ilustra como você pode selecionar itens de um ou um ListBox
ComboBox
, e alterar o conteúdo das listas do código para que a adição e remoção de elementos seja refletida na interface do usuário.