Relaycommand e método de execução sem parâmetros

Atualmente estou aprendendo WPF e MVVM, eu acho que eu recebo a maior parte e como funciona, mas eu já vi algo sobre o uso do RelayCommand (ou DelegateCommand) que eu não entendo. Eu acho que tem a ver com a maneira como os delegados trabalham.

Por favor, note que o código abaixo é todo apenas em soluções de teste no momento, então não há código ao vivo. Também estou considerando isso para comandos que não exigem um parâmetro como fechar e entender por que ele funciona.

Então, se eu pegar o RelayCommand que Josh Smith criou (http://msdn.microsoft.com/pt-br/magazine/dd419663.aspx#id0090030) Eu posso configurar um comando como este:

RelayCommand updateTextContentCommand;

public ICommand UpdateTextContentCommand
{
    get
    {
        if (updateTextContentCommand == null)
        {
            updateTextContentCommand = new RelayCommand(
                param => this.UpdateTextContentCommand_Execute());
        }
        return updateTextContentCommand;
    }
}

com este método de execução:

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

Eu usei uma ligação simples para um TextBlock para ver o resultado e o comando está ligado a um botão. Isso funciona bem. O que eu não entendo é o uso da expressão lambda para criar o comando. oAction<object> espera um parâmetro, não é? então por que esse código funciona?

Se eu mudar o código acima para

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

Eu recebo este erro:

* A melhor correspondência de método sobrecarregado para 'MVVM.RelayCommandTesting.Framework.RelayCommand.RelayCommand (System.Action)' tem alguns argumentos inválidos

Argumento 1: não é possível converter de 'void' para 'System.Action' *

e removendo o() depois de executar dá este erro:

Argumento 1: não é possível converter de 'grupo de métodos' para 'System.Action'

Mas se eu mudar o código assim:

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

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

Ele cumpre e funciona bem. Se eu mudar a visão para usar o CommandParameter eu posso então usar param para ajustar o conteúdo de texto usando este método mas se eu usar o estilo lambda eu tenho que passar um parâmetro para a linha então é como isto param =>this.UpdateTextContentCommand_Execute(param).

No meu teste eu estou codificando o valor de CommandParameter, mas eu acho que provavelmente seria dados ligados a uma propriedade do ViewModel em um sistema real, assim você seria capaz de passar o parâmetro no estilo lambda.

Alguém pode explicar por que a versão sem parâmetros funciona com o estilo lambda, por favor?

Obrigado por tomar o tempo para ler este.

Parece que a pergunta abaixo tinha algumas perguntas sobre o lambda também, mas não vejo que responda à minha pergunta.

Passando um parâmetro usando o RelayCommand definido no ViewModel (do exemplo de Josh Smith)

questionAnswers(1)

yourAnswerToTheQuestion