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)