El enlace de datos conecta dos objetos llamados source (origen) y target (destino). El objeto source proporciona los datos y el objeto target es el que los consumirá y a menudo los visualizará desde el objeto source. Por ejemplo una etiqueta (Label) es un target y normalmente se enlaza con la propiedad Text a una propiedad publica de tipo string en objeto source.
El beneficio principal del enlace de datos es que no hay que preocuparse de tener los datos sincronizados ente las vistas y la fuente de datos. Los cambios que ocurren en source son automaticamente enviados al objeto target a través de los escenarios enlazados por el framework, y los cambios que ocurren en el target pueden opcionalmente ser sincronizados con el objeto source.
Establecer el enlace de datos (Data Binding) es un proceso de dos pasos:
- La propiedad BindingContext del objeto target tiene que establecerse en el objeto source.
- Un enlace tiene que ser establecido ente el target y el source. En XAML, esto es archivado usando la palabra reservada Binding. En C# se consigue a través del metodo SetBinding.
XAML
El siguiente ejemplo de codigo demuestra como realizar un enlace de datos en XAML.
1 |
<Entry Text="{Binding Nombre}" ... /> |
Se establece un enlace entre la propiedad Entry.Text y la propiedad Nombre del objeto source. Los cambios hechos en el control Entry serán automaticamente propagados al objeto fuente. De forma similar, si los cambios son hechos en la propiedad Nombre del objeto source, entonces el motor de enlace de Xamarin.Forms actualizará el contenido del control Entry. Esto es conocido como enlace de doble sentido (two-way bindinng). Para que funcione este tipo de enlace, la clase modelo tiene que implementarse a partir de la interfaz INotifyPropertyChanged.
Sin embargo la propiedad BindingContext de la pagina XAML puede ser establecida en XAML o mediante código C#.
1 2 3 4 5 |
public HomePage(Employee employee) { InitializeComponent(); this.BindingContext = ListaJuegos; } |
Mientras que la propiedad BindingContext de cada objeto destino (target) puede ser establecida individualmente, esto no es necesario ya que la BindingContext es una propiedad especia que puede ser heredada por todos sus hijos. Es asi que cuando se estable esta propiedad en ContentPage todos sus hijos tienen el mismo BindingContext y pueden enlazar propiedades del objeto ListaJuegos.
El siguiente ejemplo muestra como llevar a cabo este enlace mediante codigo C#:
1 2 3 4 5 6 7 8 9 10 |
public HomePage(Juego juego) { this.BindingContext = juego; var Titulo = new Entry() { HorizontalOptions = LayoutOptions.FillAndExpand }; firstName.SetBinding(Entry.TextProperty, "Titulo"); ... } |
En el constructor de ContentPage le pasamos una instancia del objeto juegoy establecemos la propiedad BindingContext para enlazarlo. De esto modo es instaciado el control Entry. El enlace entre la propiedad Entry.Text del target y la propiedad Titulo del source ahora estarán establecidas. Los cambios que se realicen en el control Entry serán propagados al objeto juego. De forma parecida, si se realizan cambios en la propiedad juego.Titulo entonces en motor de enlace de Xamarin.Forms actualizará también el contenido del control Entry mostrando el nuevo valor en la propiedad Entry.Text. Cuando esta segunda parte ocurre, se le conoce como enlace bidireccional (two-way binding) pero para que funcione la clase tiene que implementar la interfaz INotifyPropertyChanged que veremos en el siguiente artículo.