Introducción a las plantillas de datos de Xamarin.Forms
Xamarin.FormsLas plantillas de datos de permiten definir la presentación de los datos en los controles admitidos. En este artículo se ofrece una introducción a las plantillas de datos y se analiza por qué son necesarias.
Considere la posibilidad de un elemento ListView
que muestra una colección de objetos Person
. En el ejemplo de código siguiente se muestra la definición de la clase Person
:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public string Location { get; set; }
}
La clase Person
define las propiedades Name
, Age
y Location
, que se pueden establecer al crear un objeto Person
. El objeto ListView
se usa para mostrar la colección de objetos Person
, como se muestra en el ejemplo de código XAML siguiente:
<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>
Se agregan elementos al objeto ListView
en XAML mediante la inicialización de la propiedad ItemsSource
a partir de una matriz de instancias de Person
.
Nota:
Tenga en cuenta que el elemento x:Array
requiere un atributo Type
que indica el tipo de los elementos de la matriz.
La página de C# equivalente se muestra en el ejemplo siguiente de código, en el que se inicializa la propiedad ItemsSource
en un elemento List
de instancias 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) }
}
};
}
ListView
llama a ToString
cuando se muestran los objetos de la colección. Como no hay ninguna invalidación de Person.ToString
, ToString
devuelve el nombre de tipo de cada objeto, como se muestra en las capturas de pantalla siguientes:
El objeto Person
puede invalidar el método ToString
para mostrar datos significativos, como se muestra en el ejemplo de código siguiente:
public class Person
{
...
public override string ToString ()
{
return Name;
}
}
Como resultado, ListView
muestra el valor de propiedad Person.Name
para cada objeto de la colección, como se muestra en las capturas de pantalla siguientes:
La invalidación de Person.ToString
podría devolver una cadena con formato formada por las propiedades Name
, Age
y Location
. Pero este enfoque solo ofrece un control limitado sobre la apariencia de cada elemento de datos. Para obtener más flexibilidad, se puede crear un elemento DataTemplate
que defina la apariencia de los datos.
Creación de una plantilla de datos de
DataTemplate
se usa para especificar la apariencia de los datos, y normalmente se utiliza el enlace de datos para mostrar los datos. Un escenario de uso común es cuando se muestran datos de una colección de objetos en un control ListView
. Por ejemplo, cuando se enlaza un elemento ListView
a una colección de objetos Person
, la propiedad ListView.ItemTemplate
se establecerá en un elemento DataTemplate
que define la apariencia de cada objeto Person
de ListView
. DataTemplate
contendrá los elementos que se enlazan a los valores de propiedad de cada objeto Person
. Para más información sobre el enlace de datos, consulte Data Binding Basics (Aspectos básicos del enlace de datos).
Una instancia de DataTemplate
que se coloca como un elemento secundario directo de las propiedades enumeradas anteriormente se conoce como una plantilla insertada. Como alternativa, se puede definir un elemento DataTemplate
como un recurso de nivel de control, de página o de aplicación. La elección de dónde se puede definir un elemento DataTemplate
afecta a dónde se puede usar:
- Una instancia de
DataTemplate
definida en el nivel de control solo se puede aplicar al control. - Un instancia de
DataTemplate
definida en el nivel de página se puede aplicar a varios controles válidos de la página. - Una instancia de
DataTemplate
definida en el nivel de aplicación se puede aplicar a los controles válidos de toda la aplicación.
Las plantillas de datos situadas más abajo en la jerarquía de vistas tienen prioridad sobre las definidas más arriba cuando comparten atributos x:Key
. Por ejemplo, una plantilla de datos de nivel de aplicación se reemplazará por una plantilla de datos de nivel de página, y una plantilla de datos de nivel de página se reemplazará por una plantilla de datos de nivel de control, o bien una plantilla de datos insertada.