Introdução aos Xamarin.Forms modelos de dados
Xamarin.Forms Os modelos de dados fornecem a capacidade de definir a apresentação de dados em controles com suporte. Este artigo fornece uma introdução aos modelos de dados, examinando o motivo pelo qual eles são necessários.
Considere uma ListView
que exibe uma coleção de objetos Person
. O exemplo de código a seguir mostra a definição da classe Person
:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Location { get; set; }
}
A classe Person
define as propriedades Name
, Age
e Location
, que podem ser definidas quando um objeto Person
é criado. O ListView
é usado para exibir a coleção de objetos Person
, conforme mostrado no exemplo de código XAML a seguir:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:DataTemplates"
...>
<StackLayout Margin="20">
...
<ListView Margin="0,20,0,0">
<ListView.ItemsSource>
<x:Array Type="{x:Type local:Person}">
<local:Person Name="Steve" Age="21" Location="USA" />
<local:Person Name="John" Age="37" Location="USA" />
<local:Person Name="Tom" Age="42" Location="UK" />
<local:Person Name="Lucas" Age="29" Location="Germany" />
<local:Person Name="Tariq" Age="39" Location="UK" />
<local:Person Name="Jane" Age="30" Location="USA" />
</x:Array>
</ListView.ItemsSource>
</ListView>
</StackLayout>
</ContentPage>
Itens são adicionados ao ListView
no XAML inicializando a propriedade ItemsSource
de uma matriz de instâncias de Person
.
Observação
Observe que o elemento x:Array
requer um atributo Type
que indica o tipo dos itens na matriz.
A página em C# equivalente é mostrada no exemplo de código a seguir, que inicializa a propriedade ItemsSource
para um List
de instâncias de Person
:
public WithoutDataTemplatePageCS()
{
...
var people = new List<Person>
{
new Person { Name = "Steve", Age = 21, Location = "USA" },
new Person { Name = "John", Age = 37, Location = "USA" },
new Person { Name = "Tom", Age = 42, Location = "UK" },
new Person { Name = "Lucas", Age = 29, Location = "Germany" },
new Person { Name = "Tariq", Age = 39, Location = "UK" },
new Person { Name = "Jane", Age = 30, Location = "USA" }
};
Content = new StackLayout
{
Margin = new Thickness(20),
Children = {
...
new ListView { ItemsSource = people, Margin = new Thickness(0, 20, 0, 0) }
}
};
}
O ListView
chama ToString
ao exibir os objetos na coleção. Como não há uma substituição de Person.ToString
, ToString
retorna o nome do tipo de cada objeto, conforme mostrado nas capturas de tela seguir:
O objeto Person
pode substituir o método ToString
para exibir dados significativos, conforme mostrado no exemplo de código a seguir:
public class Person
{
...
public override string ToString ()
{
return Name;
}
}
Isso faz com que ListView
exiba o valor da propriedade Person.Name
para cada objeto na coleção, conforme mostrado nas capturas de tela seguir:
A substituição Person.ToString
poderia retornar uma cadeia de caracteres formatada composta pelas propriedades Name
, Age
e Location
. No entanto, essa abordagem oferece apenas controle limitado sobre a aparência de cada item de dados. Para ter mais flexibilidade, é possível criar um DataTemplate
que define a aparência dos dados.
Criando um DataTemplate
Um DataTemplate
é usado para especificar a aparência dos dados e normalmente usa a associação de dados para exibir dados. Um cenário de uso comum é exibir dados de uma coleção de objetos em um ListView
. Por exemplo, quando um ListView
está associado a uma coleção de objetos Person
, a propriedade ListView.ItemTemplate
é definida como um DataTemplate
que define a aparência de cada objeto Person
no ListView
. O DataTemplate
conterá elementos que associam aos valores de propriedade de cada objeto Person
. Para obter mais informações sobre vinculação de dados, veja Noções básicas de vinculação de dados.
Um DataTemplate
que é colocado como filho direto das propriedades listadas acima é conhecido como um modelo embutido. Como alternativa, é possível definir um DataTemplate
como um recurso de nível de controle, nível de página ou nível de aplicativo. Escolher em que local definir um DataTemplate
afeta o local em que ele pode ser usado:
- Um
DataTemplate
definido no nível do controle só pode ser aplicado ao controle. - Um
DataTemplate
definido no nível da página só pode ser aplicado a vários controles válidos na página. - Um
DataTemplate
definido no nível do aplicativo pode ser aos controles válidos em todo o aplicativo.
Modelos de dados posicionados mais baixo na hierarquia de exibição têm precedência sobre os definidos mais acima quando eles compartilham atributos de x:Key
. Por exemplo, um modelo de dados no nível do aplicativo será substituído por um modelo de dados no nível da página e um modelo de dados no nível da página será substituído por um modelo de dados no nível de controle ou por um modelo de dados embutido.