Hay un gran esfuerzo en la comunidad de Silverlight para mantener el código de un XAML detrás del archivo lo más libre posible de código. ¿Cuál es la verdadera motivación detrás de esto?¿Cuál es la verdadera ventaja de mantener el código fuera del código XAML?
Por ejemplo, ¿cuál es la ventaja de utilizar un comando en lugar de un controlador de eventos? Si tengo
<Button x:Name="SaveButton" Content="Save" Click="SaveButton_Click" />
...
private void SaveButton_Click(object sender, RoutedEventArgs e) {
_myViewModel.SaveChanges();
}
Entonces, ¿por qué es preferible?
<Button x:Name="SaveButton" Content="Save" Command="{Binding SaveCommand}" />
Donde obviamente el SaveCommand
en mi modelo de vista va a invocar efectivamente SaveChanges()
.
Esto puede llevar a situaciones en las que la vista es 100% XAML, incluso instanciar el modelo de vista en XAML, y las conexiones entre la vista y el modelo de vista se realizan completamente mediante el enlace. Claro que está limpio, pero ¿qué más es? ¿Flexible? ¿Por qué? la vista aún necesita trabajar con el ViewModel adecuado, de modo que si la conexión entre los dos existe y está implícita, ¿por qué no hacerlo más explícito? También tiene la desventaja de perder soporte en tiempo de compilación. Si conecto mi botón a un controlador de eventos que no existe, el compilador me lo dirá. No lo hará si me enlace a un comando inexistente.
Me inclino a estar de acuerdo con usted en esto, que si no tiene el tipo de aplicación donde los comandos son ampliamente útiles, entonces realmente no veo lo que le compra el tipeo extra. Como dices, no afecta la capacidad de prueba del modelo de vista de una forma u otra. Algunas personas mantienen la opinión de que una vez que comienzas a tener CUALQUIER código de código subyacente, no serás capaz de detenerte a escondidas en la lógica que debería estar en el modelo de vista. –
La preferencia se debe a la capacidad de prueba, no al marcado xaml/codebehind. Esta pregunta sería realmente interesante si su ejemplo de código tuviera los dos enfoques para probar estas alternativas. es decir, su prueba para ViewModel.SaveChanges() y una prueba basada en ICommand. – itchi