Actualmente estoy aprendiendo WPF y MVVM, creo que obtengo la mayor parte y cómo funciona, pero he encontrado algo sobre el uso del RelayCommand (o DelegateCommand) que no entiendo. Creo que tiene que ver con la forma en que trabajan los delegados.Comando de relé y método de ejecución sin parámetros
Tenga en cuenta que el código que se muestra a continuación solo se encuentra en soluciones de prueba en este momento, por lo que no hay código en vivo. También estoy considerando esto para comandos que no requieren un parámetro como close y para entender por qué funciona.
Así que si tomo el RelayCommand que Josh Smith creó (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030) que puede configurar un comando como este:
RelayCommand updateTextContentCommand;
public ICommand UpdateTextContentCommand
{
get
{
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
param => this.UpdateTextContentCommand_Execute());
}
return updateTextContentCommand;
}
}
con este método de ejecución:
public void UpdateTextContentCommand_Execute()
{
this.TextContent = DateTime.Now.ToString();
}
he usado una unión simple de un TextBlock para ver el resultado y el comando está vinculado a un botón. Esto funciona bien Lo que no entiendo es el uso de la expresión lambda para crear el comando. El Action<object>
espera un parámetro, ¿no es así? Entonces, ¿por qué funciona este código?
Si cambio el código anterior para
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
this.UpdateTextContentCommand_Execute());
}
consigo estos errores:
* El partido mejor método sobrecargado para 'MVVM.RelayCommandTesting.Framework.RelayCommand.RelayCommand (System.Action)' tiene algunos argumentos no válidos
argumento 1: no se puede convertir de 'vacío' a 'System.Action' *
y extracción de la ()
después de ejecutar da este error:
Argumento 1: no se puede convertir de 'grupo Método' a 'System.Action'
Pero si cambio el código de la siguiente manera:
if (updateTextContentCommand == null)
{
updateTextContentCommand = new RelayCommand(
this.UpdateTextContentCommand_Execute);
}
public void UpdateTextContentCommand_Execute(object param)
{
this.TextContent = DateTime.Now.ToString();
}
se cumple y funciona bien Si cambio la vista para usar CommandParameter, puedo usar param para establecer el contenido del texto usando este método, pero si uso el estilo lambda, tengo que pasar un parámetro a la línea, así es como param =>this.UpdateTextContentCommand_Execute(param)
.
En mi prueba, me resulta difícil codificar el valor de CommandParameter, pero supongo que lo más probable es que esté enlazado a una propiedad del ViewModel en un sistema real para que pueda pasar el parámetro en el estilo lambda.
¿Alguien puede explicar por qué la versión sin parámetros funciona con el estilo lambda, por favor?
Gracias por tomarse el tiempo para leer esto.
Parece que la pregunta siguiente también tenía algunas preguntas sobre la lambda pero no veo que responda mi pregunta.
Passing a parameter using RelayCommand defined in the ViewModel (from Josh Smith example)
+1 para una pregunta detallada que demuestre que ya ha intentado algo. –
Saludos. Siempre trato de esforzarme al publicar preguntas, ya que encuentro preguntas como esta útiles cuando estoy buscando respuestas. – Kioshiki