Xamarin.Forms Compiled Bindings

Introducción

El sistema de enlace a datos (Bindings) incluido en Xamarin.Forms es una de las piezas fundamentales a la hora de trabajar con la UI y la arquitectura de la App. Sin embargo, el sistema de enlace a datos cuenta con algunos problemas:

  • Los Bindinds se resuelven en tiempo de ejecución usando reflexión con un coste (rendimiento) variado dependiendo de la plataforma donde se ejecute el código.
  • No hay validación de expresiones de enlace a datos en tiempo de compilación ya que se resuelven en runtime. Esto quiere decir que, errores de bindings no son detectados hasta que la aplicación se esta ejecutando y ver que no se comporta como se espera, etc.

Utilizando Bindings compilados

Los bindings compilados están disponibles en Xamarin.Forms desde hace un tiempo. Entonces…¿por qué hablamos de ellos de nuevo?. En Xamarin.Forms 3.3 se soportan más escenarios para los bindings compilados.

El proceso para utilizar bindings compilados comienza por utilizar compilación de XAML:

[assembly: XamlCompilation (XamlCompilationOptions.Compile)]

A continuación, utilizamos el atributo x:DataType disponible en cada elemento de tipo VisualElement que afectará al elemento y todos sus hijos:

<StackLayout
     x:DataType="viewModels:MainViewModel">
     <StackLayout.BindingContext>
          <viewModels:MainViewModel />
     </StackLayout.BindingContext>
     <Label
          Text="{Binding Value1}"/>
     <Label
          Text="{Binding Value2}" />
     <Label
          Text="{Binding Value3}" />
</StackLayout>

NOTA: Es recomendable establecer el atributo x: DataType en el mismo nivel de la jerarquía de elementos visuales en que se establece BindingContext.

Utilizando compilación XAML, las expresiones de enlace a datos no válidas se informarán como errores de compilación. Sin embargo, el compilador XAML solo informará un error de compilación para la primera expresión de enlace no válida que encuentre.

Mezclando Bindings compilados con clásicos

Las expresiones de enlace a datos solo se compilan para los elementos visuales de la jerarquía visual donde se define el atributo x:DataType. De igual forma, cualquier vista sin el atributo x:DataType utilizará enlaces a datos clásicos. Las expresiones de enlace a datos solo se compilan para la jerarquía de vistas en la que se define el atributo x: DataType.

Veamos un ejemplo donde combinar bindings compilados y no clásicos:

<StackLayout
     x:DataType="viewModels:MainViewModel">
     <StackLayout.BindingContext>
          <viewModels:MainViewModel />
     </StackLayout.BindingContext>
     <Label
          Text="{Binding Value1}"/>
     <Label
          Text="{Binding Value2}" />
     <Label
          Text="{Binding Value3}" />
     <StackLayout
          x:DataType="{x:Null}">
          <Label
               Text="{Binding Value4}" />
          <Label
               Text="{Binding Value5}" />
     </StackLayout>
</StackLayout>

Rendimiento

Los bindings compilados mejoran el rendimiento:

  • Un binding con soporte a notificación de cambios (OneWay, OneWayToSource, TwoWay) se resuelve unas 8 veces más rápido que un binding clásico.
  • Un binding compilado sin soporte a notificación de cambios (OnwTime) se revuelve 20 veces más rápido.
  • Establecer un BindingContext con bindings compilados es entorno a 5 veces más rápido que con bindings clásicos.

Entonces, ¿ofrecen mejor rendimiento los bindings compilados?

Si!. Los bindings clásicos usan reflexión. Los bindings compilados eliminan el uso de reflexión y pasan a usar una Func para obtener datos, Action para establecer datos y una lista de handlers para gestionar el cambio de propiedades.

La mejora de rendimiento depende principalmente de la plataforma, versión del sistema operativo, dispositivo, etc. Sin embargo, como podemos ver en los números anteriores, los bindings compilados son 5-20 veces más rápidos.

Puedes encontrar el ejemplo en GitHub:

Ver GitHub

Más información

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s