Las listas son de los controles más poderosos para mostrar datos que posee WinRT.
Para mostrar datos por ejemplo en un GridVew, basta con hacer esto:
<
GridView
>
Border
Background
=
"Goldenrod"
TextBlock
Text
"Texto"
/>
</
"GreenYellow"
"MidnightBlue"
"Violet"
Ellipse
Width
"50"
Height
Fill
"Red"
y el resultada será
De este ejercicio podemos destacar lo siguiente:
Sin embargo en muchas ocasiones necesitamos que los contenidos de un control de lista sean establecidos dinámicamente o que incluso puedan cambiar durante el ciclo de vida de la aplicación, lo que debemos tener presente en este escenario es lo siguiente:
Para poder revisar estos temas lo primero que necesitamos es definir un origen de datos, utilizaremos una List de Persona como datos de prueba. Necesitas datos de prueba?C# – Cómo generar datos aleatorios para realizar pruebas
Definimos nuestro origen de datos, guardaremos objetos de tipo Persona y para ellos heredamos de BindableBase el cual nos implementa ya INotifyPorpertyChanged.
public
class
Persona : BindableBase
{
private
int
_cedula;
Cedula
get
return
_cedula; }
set
_cedula = value;
SetProperty(
ref
_cedula, value);
}
string
_nombre;
Nombre
_nombre; }
_nombre = value;
_nombre, value);
_apellido;
Apellido
_apellido; }
{ SetProperty(
_apellido, value); }
_profesion;
Profesion
_profesion; }
_profesion, value); }
Y creamos una clase capaz de inicializar una colección de datos de ese objeto.
DataSourcePersonas
ObservableCollection<Persona> ListaPersonas {
;
; }
DataSourcePersonas()
Initialize();
void
Initialize()
var listaFull = TraerInfoDesdeOrigenDeDatos();
ListaPersonas =
new
ObservableCollection<Persona>(listaFull);
Para hacer Binding con nuestra fuente de datos hay que asignar el atributo ItemsSource (No DataContext como se hace habitualmente) esto lo podemos hacer desde el code behind o desde el XAML, siendo esta última la recomendación para mantener un código mas desacoplado y mejor estructurado.
Page
x:Class
"DemoGrouping.SimpleLists"
xmlns
"http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x
"http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local
"using:DemoGrouping"
xmlns:data
"using:DemoGrouping.Data"
Page.Resources
data:DataSourcePersonas
x:Key
"DatosPersonas"
Grid
"{StaticResource ApplicationPageBackgroundThemeBrush}"
Ahora creamos el GridView y le asignamos la fuente de datos.
ItemsSource
"{Binding Source={StaticResource DatosPersonas},Path=ListaPersonas}"
Si la vida fuera muy fácil todos seriamos ricos y este demo ya estaría funcionando a la perfección! pero la vida no es fácil verdad?
Este es el resultado de lo que acabamos de hacer:
Qué sucedio? Persona es un objeto complejo, y cuando le hacemos binding WinRT aplica la transformación por defecto para el tipo object, esto es ToString() y el ToString de un object es el nombre del tipo de dato.
Cómo evitarlo?
De manera intuitiva, una forma de evitarlo es colocar los items estáticamente como lo hicimos arriba con los TextBlock así:
"{Binding Source={StaticResource DatosPersonas}, Path=ListaPersonas}"
StackPanel
"{Binding Nombre}"
"{Binding Cedula}"
"{Binding Profesion}"
Pero el resultado sera el mismo… les dije que la vida no es fácil.
Pese a la intuición y al intento fallido no estamos muy lejos, lo que falta por hacer es decirle EXPLICITAMENTE a WinRT que deseamos que esos objetos hagan Binding con cada uno de los objetos asignados en ItemsSource, para ello modificamos el template del control, y es allí donde debemos dejar los controles creados anteriormente.
GridView.ItemTemplate
DataTemplate
"{Binding Apellido}"
Par obtener la visualización que muestro en la foto, debes aplicar estos estilos:
Style
"border-st"
TargetType
"Border"
Setter
Property
"Background"
Value
"DarkKhaki"
"Padding"
"5"
"Margin"
"Width"
"230"
"texblock-st"
"TextBlock"
"FontSize"
"40"
"Foreground"
"White"
"TextWrapping"
"Wrap"
Quedando el código finalmente así
xmlns:d
"http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc
"http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable
"d"
"{StaticResource border-st}"
"{StaticResource texblock-st}"
Espero les sea de ayuda.
Hasta pronto.