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