Mvvm Light es un framework ligero para implementar un patrón de diseño MVVM en aplicaciones en .NET Framework, bastante popular en desarrollos en WPF.
Implementar MVVM (Model View ViewModel) en WPF sin un framework nos obliga a implementar una gran cantidad de herramientas por nosotros mismos. Existen múltiples frameworks disponibles para facilitarnos la vida.
De entre las distintas alternativas MVVM Light, como su nombre indica, destaca por ser un framework ligero, sencillo, y con una curva de aprendizaje suave.
Aunque adolece de ciertas características de frameworks más potentes, MVVM Light resulta mínimamente intrusivo y, sin embargo, proporciona la mayoría de herramientas habituales en un patrón MVVM. En esta entrada veremos un repaso rápido de sus principales características.
Instalación
La instalación de MVVM Light está disponible a través de una Extensión de Visual Studio (2013, 2015 y 2017). Esta extensión añade plantillas para creación de un Scaffold de una aplicación con MVVM Light, y unos pocos snippets para facilitar la programación.
También es posible añadir MVVM Light en una solución existente a través del gestor de paquetes NuGet.
Componentes de MVVM Light
Cómo decíamos MVVM Light proporciona la mayoría de herramientas habituales en un patrón MVVM. Vamos a ver algunas de estas características.
RelayCommand
MVVM Light proporciona la implementación de ICommand en su objeto RelayCommand, tanto con parámetros como sin parámetros, y con la posibilidad de habilitar/deshabilitar el comando a través de una función (canExecute)
public class RelayCommand<T> : ICommand
{
public RelayCommand(Action<T> execute);
public RelayCommand(Action<T> execute, Func<T, bool> canExecute);
}
Aquí tendríamos un ejemplo de uso, donde definimos el comando como propiedad de nuestro ViewModel.
public RelayCommand<T> MyCommand { get; set; }
En el constructor del ViewModel instanciamos los command.
MyCommand = new RelayCommand(myAccion);
Que apunta a una función que ejecuta el comando.
myAccion(T);
Event to command
También disponemos del habitual ‘Event to command’, que permite routear un evento a un comando. Su uso, sería el siguiente.
<i:interaction.triggers>
<i:eventtrigger eventname=""TextChanged"">
<mvvm:eventtocommand command=""{Binding" searchcommand,="" mode="OneWay}"">
</mvvm:eventtocommand></i:eventtrigger>
</i:interaction.triggers>
INotifyPropertyChanged
Por supuesto, MVVM Light proporciona su implementación de INotifyPropertyChanged, que permite informar al UI de cambios en la propiedad bindeada.
public virtual void RaisePropertyChanged<T>([CallerMemberName] string propertyName = null, T oldValue = default(T), T newValue = default(T), bool broadcast = false);
IoC y Locator
MVVM Light también proporciona una implementación sencilla de un Inversor de Contenido (IoC), llamado SimpleIoC. Para ello, lo habitual es generar nuestro Locator, que registra las clases empleadas.
public class ViewModelLocator
{
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<MainViewModel>();
}
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
}
Generalmente declararemos el Locator como recurso estático en App.xaml de la siguiente forma
<Application.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</Application.Resources>
Finalmente, en las vistas podemos asociar el DataContext a los distintos ViewModel de la siguiente forma.
DataContext="{Binding Main, Source={StaticResource Locator}}">
Messenger
MVVML Light también implementa un servicio de Messenger que implementa el patrón PubSub, y nos permite enviar mensajes entre objetos manteniendo débil el acoplamiento entre clases.
Por ejemplo, un objeto que desee enviar un mensaje usaría el siguiente método.
public void SenderMethod()
{
MessengerInstance.Send<NotificationMessage<string>>(new NotificationMessage<string>("Generic Value", "notification message"));
}
Para recibirlo, uno o varios objetos podrían sindicarse a los mensajes, definiendo una función de callback.
public RecievedMethod()
{
MessengerInstance.Register<NotificationMessage<string>>(this, NotifyMe);
}
public void NotifyMe(NotificationMessage notificationMessage)
{
string notification = notificationMessage.Notification;
string genericValue = notificationMessage.Content;
//do your work
}
DispatcherHelper
Finalmente, MVVM Light proporciona la clase DispatcherHelper, que facilita el uso de tareas en el Thread principal del UI.
Este se inicializa al principio de la aplicación.
DispatcherHelper.Initialize();
Y puede ser empleado para invocar acciones en el proceso de la UI de la siguiente forma.
DispatcherHelper.UIDispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(()=> { }));
Como vemos, MVVM Light es un framework sencillo, pero que proporciona los componentes básicos necesarios para implementar MVVM. Es Open Source, y está disponible en https://github.com/lbugnion/mvvmlight