Partilhar via


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:

ListView sem um modelo de dados

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:

ListView com um modelo de dados

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.