Relaycommand y método de ejecución sin parámetros

Actualmente estoy aprendiendo WPF y MVVM, creo que obtengo la mayor parte y cómo funciona, pero encontré algo sobre el uso de RelayCommand (o DelegateCommand) que no entiendo. Creo que tiene que ver con la forma en que trabajan los delegados.

Tenga en cuenta que el código a continuación está solo en las soluciones de prueba en este momento, por lo que no hay código en vivo. También estoy considerando esto para los comandos que no requieren un parámetro como cerrar 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) Puedo 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();
}

Utilicé un enlace simple a 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. losAction<object> espera un parámetro ¿no? Entonces, ¿por qué funciona este código?

Si cambio el código anterior a

if (updateTextContentCommand == null)
{
    updateTextContentCommand = new RelayCommand(
        this.UpdateTextContentCommand_Execute());
}

Me sale estos errores:

* La mejor coincidencia del método sobrecargado para 'MVVM.RelayCommandTesting.Framework.RelayCommand.RelayCommand (System.Action)' tiene algunos argumentos no válidos

Argumento 1: no se puede convertir de 'void' a 'System.Action' *

y eliminando el() después de Ejecutar da este error:

Argumento 1: no se puede convertir de 'grupo de métodos' a 'System.Action'

Pero si cambio el código así:

if (updateTextContentCommand == null)
{
    updateTextContentCommand = new RelayCommand(
        this.UpdateTextContentCommand_Execute);
}

public void UpdateTextContentCommand_Execute(object param)
{
    this.TextContent = DateTime.Now.ToString();
}

cumple y funciona bien. Si cambio la vista para usar CommandParameter, puedo usar param para configurar 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 este param =>this.UpdateTextContentCommand_Execute(param).

En mi prueba, estoy codificando el valor del parámetro CommandParameter, pero creo que lo más probable es que los datos estén vinculados a una propiedad de 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 de abajo también tenía algunas preguntas sobre la lambda, pero no veo que responda a mi pregunta.

Pasando un parámetro usando RelayCommand definido en el modelo de visualización (del ejemplo de Josh Smith)

Respuestas a la pregunta(1)

Su respuesta a la pregunta