Comandos en Silverlight – Play Silverlight

Una de las nuevas característcas introducidas en Silverlight 4 es el sistema de comandos con el que conseguimos separar la vista del modelo vista permitiendo aplicar el patrón MVVM. Los controles que soportan comandos son aquellos que heredan de ButtonBase y de Hyperlink. Ahora, a través de las propiedades Command y CommandParameter, podemos asociar a vista y modelo vista sin necesidad de codificar nada en el code behind.

Para utilizar comandos en nuestra aplicación, el primer paso es crear nuestro propio comando que implementará la interfaz ICommand. Para cumplir esta interfaz deberemos implementar dos métodos: CanExecute, en el que podremos determinar bajo qué condiciones podrá lanzarse el comando; y Execute, donde se ejecutará el código asociado al mismo.

En el caso del ejemplo, he creado un comando genérico con dos propiedades que corresponden a una acción a lanzar en el método Execute y a una función a ejecutar en CanExecute, que asignaremos en el constructor del comando. Así, eliminaremos la necesidad de crear una clase que implemente la interfaz ICommand por cada comando que expongamos en la clase modelo vista. La clase quedaría de esta manera:

/// <summary>
/// Clase MyCommand
/// </summary>
/// <typeparam name="T"></typeparam>
public class MyCommand<T> : ICommand
{
#region PROPERTIES

/// <summary>
/// Acción a ejecutar
/// </summary>
Action<T> exec;

/// <summary>
/// Función que determina si el comando puede lanzarse
/// </summary>
Func<T, bool> canExec;

#endregion

#region CONSTRUCTORS

public MyCommand(Action<T> exec)
{
this.exec = exec;
}

public MyCommand(Action<T> exec, Func<T, bool> canExec)
{
this.exec = exec;
this.canExec = canExec;
}

#endregion

#region ICommand Members

public bool CanExecute(object parameter)
{
if (canExec != null)
return canExec((T)parameter);

else return true;
}

public event EventHandler CanExecuteChanged;

public void Execute(object parameter)
{
exec((T)parameter);
}

#endregion
}

A continuación, en la clase modelo vista añadiremos una propiedad de tipo ICommand, que inicializaremos con un método a ejecutar. Como se puede ver en el código anterior, hay dos constructores, uno para el caso el en el que no existan condiciones para habilitar la ejecución del comando y otro para cuando sí las haya, para lo cual se incluirá como parámetro en el constructor una función que devuelva un booleano.

Por último, queda asociar el comando a la propiedad Command de un botón en el xaml y, de forma opcional, se puede pasar un parámetro con el comando que, en este caso, es el valor de la propiedad Text de una caja de texto.

<Button Name="btnCommand" Content="Send" Command="{Binding MyCommand}"
CommandParameter="{Binding Path=Text, ElementName=tbMessage}"

Por si a alquien le pudiera interesar, aquí dejo el código correspondiente al ejemplo (eliminar extensión .doc y descomprimir) EjemplosComandos.rar.

Anuncios
Esta entrada fue publicada en Silverlight y etiquetada , , . Guarda el enlace permanente.

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 )

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 )

Google+ photo

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

Conectando a %s