El método SetBinding necesita dos parámetros. El primer parámetro especifica la información acerca del tipo de enlace. El segundo parámetro es usado para proporcionar información acerca de que enlazar y como hacerlo. El segundo parámetro es, en la mayoría de los casos, únicamente una cadena de texto (string) que contenga el nombre de la propiedad en el BindingContext. El siguiente código es usado para enlazar directamente con BindingContext.
1 |
label.SetBinding(Label.TextProperty, new Binding(".")); |
La sintaxis del punto entrecomillado dice a Xamarin.Forms que use el BindingContext como fuente de datos en lugar de una propiedad en el BindingContext. Esto es util cuando el BindingContext es un tipo simple como un string o un int.
Notificacion de cambio de propiedad
Por defecto el objeto target solo recibe el valor del objeto source cuando el enlace es creado. Para mantener la interfaz de usuario sincronizada con el objeto source, tiene que haber un camino que notifique al target cuando el objeto source cambie. Este mecanismo es proporcionado por la interfaz INotifyPropertyChanged. Implementando esta interfaz se proporcionaran notificaciones a cualquier control con datos enlazados cuando las propiedades subyacentes cambien.
Los objetos que implementan INotifyPropertyChanged tienen que lanzar el evento PropertyChanged cuando una de sus propiedades es actualizada con un nuevo valor, como se demuestra a continuación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
using System; using System.ComponentModel; using System.Runtime.CompilerServices; public class MiObjeto : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; string _titulo; public string Titulo { get { return _titulo; } set { if (value.Equals(_titulo, StringComparison.Ordinal)) { // Si el valor no ha cambiado no hay que hacer nada return; } _titulo = value; OnPropertyChanged(); } } void OnPropertyChanged([CallerMemberName] string propertyName = null) { var handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); } } } |
Cuando la propiedad MiObjeto.Titulo cambie el metodo OnPropertyChanged es invocado, el cual lanzará el evento PropertyChanged. Para evitar disparar eventos innecesarios el evento PropertyChanged solo sera lanzado cuando el valor cambie.
Atención que el método OnPropertyChanged el parametro propertyName esta precedido por el atributo CallerMemberName. Esto asegura que si el metodo OnPropertyChanged es invocado con un valor null, el atributo CallerMemberName proporcionará el nombre del método que invocó OnPropertyChanged.