Condividi tramite


Introduzione ai Xamarin.Forms modelli di dati

Xamarin.Forms i modelli di dati consentono di definire la presentazione dei dati nei controlli supportati. Questo articolo offre un'introduzione ai modelli di dati e spiega perché sono necessari.

Si consideri un ListView in cui viene visualizzata una raccolta di oggetti Person. L'esempio di codice seguente illustra la definizione della classe Person:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Location { get; set; }
}

La classe Person definisce le proprietà Name, Age e Location, che possono essere impostate quando viene creato un oggetto Person. L'elemento ListView viene usato per visualizzare la raccolta di oggetti Person, come illustrato nell'esempio di codice XAML seguente:

<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>

Gli elementi vengono aggiunti all'oggetto ListView in XAML inizializzando la proprietà ItemsSource da una matrice di istanze Person.

Nota

Si noti che l'elemento x:Array richiede un attributo Type che indica il tipo degli elementi nella matrice.

La pagina C# equivalente è illustrata nell'esempio di codice seguente, che inizializza la proprietà ItemsSource su un List di istanze 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) }
        }
    };
}

L'elemento ListView chiama ToString durante la visualizzazione degli oggetti nella raccolta. Poiché non esiste alcuna sostituzione di Person.ToString, ToString restituisce il nome del tipo di ogni oggetto, come illustrato negli screenshot seguenti:

ListView senza un modello di dati

L'oggetto Person può eseguire l'override del metodo ToString per visualizzare dati significativi, come illustrato nell'esempio di codice seguente:

public class Person
{
  ...
  public override string ToString ()
  {
    return Name;
  }
}

Il risultato è l'elemento ListView che visualizza il valore della proprietà Person.Name per ogni oggetto nella raccolta, come illustrato negli screenshot seguenti:

ListView con un modello di dati

La sostituzione di Person.ToString potrebbe restituire una stringa formattata costituita dalle proprietà Name, Age e Location. Questo approccio offre tuttavia solo un controllo limitato sull'aspetto di ogni elemento di dati. Per una maggiore flessibilità, è possibile creare un oggetto DataTemplate che definisce l'aspetto dei dati.

Creazione di un oggetto DataTemplate

Un oggetto DataTemplate viene usato per specificare l'aspetto dei dati e usa in genere il data binding per visualizzare i dati. Lo scenario di utilizzo comune è durante la visualizzazione di dati da una raccolta di oggetti in un elemento ListView. Ad esempio, quando un elemento ListView è associato a una raccolta di oggetti Person, la proprietà ListView.ItemTemplate verrà impostata su un elemento DataTemplate che definisce l'aspetto di ogni oggetto Person in ListView. L'oggetto DataTemplate conterrà gli elementi che associano i valori delle proprietà di ogni oggetto Person. Per altre informazioni sul data binding, vedere Data Binding Basics (Nozioni di base sul data binding).

Un oggetto DataTemplate che viene inserito come figlio diretto delle proprietà elencate in precedenza è detto modello inline. In alternativa, un oggetto DataTemplate può essere definito come una risorsa a livello di controllo, a livello di pagina o a livello di applicazione. Scegliere dove definire un oggetto DataTemplate ha effetto su dove può essere usato:

  • Un oggetto DataTemplate definito a livello di controllo può essere applicato solo al controllo.
  • Un oggetto DataTemplate definito a livello di pagina può essere applicato a più controlli validi nella pagina.
  • Un oggetto DataTemplate definito a livello di applicazione può essere applicato a controlli validi in tutta l'applicazione.

I modelli di dati inferiori nella gerarchia di visualizzazione hanno la precedenza rispetto a quelli definiti a livello superiore quando condividono attributi x:Key. Ad esempio, un modello di dati a livello di applicazione verrà sostituito da un modello di dati a livello di pagina e un modello di dati a livello di pagina verrà sostituito da un modello di dati a livello di controllo o da un modello di dati inline.