[WINRT] Behaviors

El patrón de diseño mas utilizado a la hora de crear aplicaciones con WPF, Silverlight o Windows 8 es MVVM (Model – View – ViewModel).

 

Aunque no voy a entrar a la explicación de este patrón voy a hablar de algo relacionado con él.

 

Uno de los objetivos de este patrón es ayudarnos a mantener nuestro código lo mejor estructurado posible.

 

En este post me voy a centrar en explicar una problemática existente dentro de Windows 8 y mas concretamente en las desarrolladas con XAML.

El problema radica en la no existencia de triggers que si existian en WPF, como podían ser EventTrigger que se producian al lanzarse un evento.

Debido a ello, vamos a ver como podemos extender los controles de WINRT, para que en lugar de utilizar los eventos desde el código de nuestra página / control, enlacemos a través de un Binding con una propiedad ICommand de nuestro modelo.

Para poder hacer esto, sera necesario definir una Dependency Property. Para el ejemplo concreto vamos a ver como capturar una tecla pulsada por ejemplo en un control de tipo TextBox:

   1: public class PageKeyPressBehavior

   2: {

   3:     public static readonly DependencyProperty KeyDownCommandProperty = DependencyProperty.RegisterAttached("KeyDownCommand", typeof(ICommand), typeof(PageKeyPressBehavior),

   4:                 new PropertyMetadata(DependencyProperty.UnsetValue,

   5:                     (o, e) =>

   6:                     {

   7:                         var textbox = o as TextBox;

   8:                         if (textbox != null)

   9:                         {

  10:                             if (e.NewValue != null && e.OldValue == null)

  11:                                 textbox.KeyDown +=  KeyDownEvent;

  12:                             else if (e.NewValue == null && e.OldValue != null)

  13:                                 textbox.KeyDown -= textbox_KeyDownEvent;

  14:                         }

  15:                     }));

  16:  

  17:             public static ICommand GetIntroButtonCommand(UIElement element)

  18:             {

  19:                 return (ICommand)element.GetValue(IntroButtonCommandProperty);

  20:             }

  21:  

  22:             public static void SetIntroButtonCommand(UIElement element, ICommand value)

  23:             {

  24:                 element.SetValue(IntroButtonCommandProperty, value);

  25:             }

  26:  

  27:             static void KeyDownEvent(object sender, Windows.UI.Xaml.Input.KeyRoutedEventArgs e)

  28:             {

  29:                     var textbox = sender as TextBox;

  30:                     if (textbox != null)

  31:                     {

  32:                         ICommand cmd = GetIntroButtonCommand(textbox);

  33:                         if (cmd != null)

  34:                             cmd.Execute(e.Key.ToString());

  35:                        

  36:                     }   

  37:             }

  38: }

En el código del ejemplo lo que hacemos es registrar una propiedad en los controles de tipo TextBox, y agregamos el manejador de eventos para controlar el evento KeyDown. Dentro de dicho evento lo que haremos será invocar al valor de nuestra Dependency Property.

 

Bien, ahora como utilizamos esto dentro de nuestra pagina:

1) Lo primero será agregar el namespace donde está alojada la clase que incluye nuestra Dependency Property:

   1: xmlns:be="using:MyApp.Behaviors"

2) Utilizarla dentro de nuestro TextBox:

   1: <TextBox be:KeyDownCommand="{Binding MyKeyDownCommand}" />

 

Con esto ya trendriamos enlazado nuestro ViewModel y nuestra Vista sin tener que capturar los eventos desde el propio Code Behind.

 

Espero que os sea de utilidad.

 

Saludos!

Un comentario en “[WINRT] Behaviors”

Deja un comentario

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