[Xamarin.Forms] Novedades de Xamarin.Forms 1.3: Behaviors

Novedades de Xamarin.Forms 1.3

Recientemente Xamarin lanzo la version 1.3 definitiva de Xamarin.Forms con una cantidad de novedades muy sustansiosa. Entre otras novedades contamos con:

  • Soporte para Estilos.
  • Soporte para Behaviors.
  • Soporte para Triggers (DatTriggers y MultiTriggers).
  • Nuevo miembro en las páginas, OnBackButtonPressed para gestionar la pulsación del botón físico atrás.
  • Mejoras en el DependencyService para añadir más flexibilidad a la hora de registrar dependencias.
  • Corrección de bugs.

En este artículo vamos a analizar todas las novedades relacionadas con el uso de behaviors en Xamarin.Forms 1.3.

¿Te apuntas?

Behaviors

El concepto es algo muy sencillo. Un Behavior espera por “algo” para hacer “algo”. Concretamos más. Un Behavior espera por “algo”.
Puede ser un evento que se lanza, el cambio de una propiedad o
cualquier otra acción personalizada que deseamos monitorear. Una vez que
ese “algo” se desencadena, el Behavior puede hacer
acciones muy variadas, desde cambiar el valor de una propiedad, lanzar
un evento, hacer verificaciones o validaciones, etc.

Los Behaviors nos permiten encapsular lógica que se puede
adjuntar a un componente específico. Generalmente ayudan a personalizar o
completar ciertos componentes e incluso en muchas ocasiones son un a
ayuda fundamental para mantener una estructura idónea al implementar
patrones como MVVM.

Comenzamos creando un nuevo proyecto desde cero:

Tras crear el proyecto procedemos a actualizar a Xamarin.Forms 1.3. Para
ello, vamos a gestionar los paquetes NuGet a nivel de solución.

NOTA: Si tenéis problemas al instalar Xamarin.
1.3 aseguráos de contar con la última versión de NuGet. Versiones
antiguas de NuGet pueden ocasionar problemas en la instalación. Para
asegurar tener la última versión debemos dirigirnos a Herramientas >
Extensiones y Actualizaciones -> Instalados. Aqui podremos
seleccionar NuGet e instalar la última versión.

El objetivo que buscaremos en este ejemplo sera crear un Behavior analizando todas las partes implicadas que permitira solo introducir valores numéricos en una caja de texto.

Comenzamos creando el behavior. Crearemos una clase que heredará de Behavior<T>:

public class NumericEntryBehavior : Behavior<Entry>
{
 
}

Pasamos a ver la implementación:

public class NumericEntryBehavior : Behavior<Entry>
{
     private string _lastValidText;
 
     protected override void OnAttachedTo(Entry bindable)
     {
         bindable.TextChanged += EntryTextChanged;
         base.OnAttachedTo(bindable);
     }
 
     protected override void OnDetachingFrom(Entry bindable)
     {
         bindable.TextChanged -= EntryTextChanged;
         base.OnDetachingFrom(bindable);
     }
 
     private void EntryTextChanged(object sender, EventArgs e)
     {
         var entry = sender as Entry;
         if (entry != null)
         {
             double value;
             if (string.IsNullOrEmpty(entry.Text) ||
                 Double.TryParse(entry.Text, out value))
             {
                 _lastValidText = entry.Text;
                 return;
             }
 
             entry.Text = _lastValidText;
         }    
     }
}

Cada vez que el usuario escriba algo en la caja de texto haremos una
verificación para determinar si se trata de un valor numérico. Para
ello, sobreescribimos el método OnAttachedTo donde recibiremos el objeto Entry y nos suscribiremos a su evento TextChanged. De igual forma, sobreescribimos el método OnDetachingFrom donde eliminaremos la suscripción al evento y el Behavior del objeto Entry. En el evento TextChanged intentamos parsear el contenido recibido a Double para verificar si es un dígito o no. De esa forma, vamos comprobando que lo que escribe el usuario son dígitos o no.

NOTA: Para aquellos que tengáis experiencia
definiendo Behaviors en la plataforma Windows habréis observado algunas
diferencias. No tenemos acceso al objeto AssociatedObject. En cambio, el
objeto asociado se inyecta en los casos necesarios.

Una vez definido el Behavior es hora de implementarlo en nuestra
interfaz de usuario. Para acceder al mismo debemos definir el namespace
donde se encuentra:

xmlns:behaviors="clr-namespace:Entry_Behavior.Behaviors;assembly=Entry_Behavior"

Simple. Utilizamos la sintaxis clr-namespace para definir el namespace donde se encuentra definido.

<Entry>
     <Entry.Behaviors>
        <behaviors:NumericEntryBehavior />
     </Entry.Behaviors>
</Entry>

Vamos a analizar el trozo de XAML anterior. Cada elemento que hereda de VisualElement cuenta con una propiedad de tipo IList<Behavior>. Para utilizar nuestro behavior NumericEntryBehavior, dentro de la colección de Behaviors del control Entry, definimos el mismo utilizando el espacio de nombres behaviors, definido previamente.

NOTA: De nuevo, para aquellos con experiencia
previa con Behaviors en la plataforma Windows. En Xamarin.Forms cada
elemento heredado de VisualElement cuenta con una propiedad Behaviors.
No es necesario importar librerías para poder trabajar con Behaviors.

Y todo listo!. Si ejecutamos nuestro ejemplo podemos probar el “comportamiento” añadido al control Entry.
Al escribir información veremos que solo se permiten valores numéricos o
carácteres como la coma en caso de desear escribir decimales.

El resultado es el siguiente:

Podéis descargar el ejemplo completo realizado a continuación:

Recordar que podéis dejar en los comentarios cualquier tipo de sugerencia o pregunta.

Más información

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *