Bien empecemos por reconocer la parte que de nuestro codigo que reemplazará
MVVM Light, esa parte es el
BindableBase y el
DelegateCommand, mi opinión, que ampliaré al final de este post es que no es tanto codigo ni tan dificil para que sea tan dramático el desviarse a usar una libreria de tercero sin embargo cada quien sopese sus prioridades,
MVVM Light les evitará tener que crear estas clases.
Otro par de caracteristicas restables de
MVVM Light es que tiene su contenedor de dependencias, llamado
SimpleIoC el cual ya veremos como reemplazar por
Autofac que es mucho más recomendado. Por otro lado uno de los patrones interesantes cuando se trabaja con MVVM es
el patrón Messenger, pues bien
MVVM Light tiene una implementación ya de este patrón lista para ser usada, y también una implementación de
EventToCommand, lo cual sirve para enlazarlos a comandos (ICommand) en aquellos controles y/o eventos que no proveen en mecanismo en XAML para hacerlo directamente.
Para empezar a utilizar
MVVM Light es necesario instalarlo en nuestra máquina, descargando la última versión estable desde alguno de los repositorios oficiales, como es
https://mvvmlight.codeplex.com
Luego de esto, reiniciamos el Visual Studio y podemos proceder a agregar la referencia a los proyectos desde Nuget. En proyectos como el nuestro debemos poner un tanto de atención, ya que el que debemos instalar es el MVVM Light PCL
Ahora bien, para reemplazar SimpleIoC por Autofac que ya lo tenemos en nuestro proyecto debemos instalar un extra para Autofac que nos permitirá cambiar el contenedor de dependencias en donde sea que MVVM Light lo use
Esto trae un pequeño inconveniente y es que se agrea la clase
ServiceLocator de
Microsoft Patterns and Practices, por lo que para no tener confusiones y siguiendo el estandar propuesto por ellos, nuestro
ServiceLocator anterior pasará a llamarse
ViewModelLocator y tendremos que cambiarla en los recursos generales de la aplicación.
En
ViewModelLocator procedemos a cambio el contenedor de dependencias, les dejo en comentarios lo que tendrian que dejar si deciden usar SimpleIoC
Aunque no es necesario cambiar más código en
ViewModelLocator les comparto la manera como pueden recuperar instancias usando el
ServiceLocator que fue añadido a nuestro proyecto
Ahora continuemos con los cambios que generá haber removido nuestro
DelegateCommand. La clase en MVVM Light se llama
RelayCommand
Para finalizar debemos hacer los cambios de haber en
BindableBase para no duplicar corportamiento con MVVM Light. Con el animo de no dañar toda nuestra implementación decidi conservar
BindableBase y poner una herencia a la clase base que propone MVVM Light la cual es
ViewModelBase y remover todo el codigo doble, conservando solo las caracteristica propias de la arquitectura propuesta en este ejercicio.
Por lo demás nuestras Vista Modelo se ven impactadas debido a que MVVM Light hace los Set de las propiedades diferente y tenemos que cambiarlas todas.
Esos serían todos los cambios, como ven nada de otro mundo. La reflexión es que si se usa MVVM Light sin saber todo lo que hemos aprendido en esta serie, pues basicamente no se comprenderá el código que se escribe.
La verdad es que usar MVVM Light es algo que no va mi forma de trabajar, soy alguien que prefiere tener el control de su código, sin embargo entiendo que es un tema personal y que cuando existen buenas librerías pues está bien si alguien decide no empezar siempre de ceros.
Yo pienso que
es una cuestion de equilibrio, de plantearse si uno quiere depender de un tercero o no para su software, en algo tan básico como esto, es tan simple como esto que es tan simple como tener a mano nuestro propio proyecto de infraestructura. Es por esta razón que verán
en el repositorio como deje un branch con el cambio a MVVM Light pero al menos en un principio espero quedarme con mi propia implementación que se me hace suficiente por ahora,
lo que hice por si más adelante quisiera pasarme a MVVM Light nuevamente en el branch principal, fue renombrar mi DelegateCommand por RelayCommand, y cambiar el SetProperty de mi BindableBase para que tenga una firma similar a la de las clases de MVVM Light.