RelayCommand de lambda com parâmetros do construtor
Se, em um arquivo XAML, vincular um Button a "Command" da classe a seguir, clicar no botão não fará com que o DoIt seja executado:
class Thing()
{
public Thing(Foo p1)
{
Command = new RelayCommand(() => DoIt(p1));
}
private DoIt(Foo p)
{
p.DoSomething();
}
public ICommand Command { get; private set; }
}
No entanto, funciona se eu inicializar um campo de p1 e passar o campo como um parâmetro para a chamada de método dentro do lambda:
class Thing()
{
private Foo field;
public Thing(Foo p1)
{
field = p1;
Command = new RelayCommand(() => DoIt(field));
}
private DoIt(Foo p)
{
p.DoSomething();
}
public ICommand Command { get; private set; }
}
Por que o primeiro falha, mas o último funciona como esperado?
Provavelmente relevante:Como os fechamentos funcionam nos bastidores? (C #)
EDIT: Para esclarecer, o seguinte também funcionaria para mim. No entanto, eu ainda gostaria de saber por que o segundo exemplo fez o que eu esperava, mas o primeiro não.
class Thing()
{
private Foo field;
public Thing(Foo p1)
{
field = p1;
Command = new RelayCommand(DoIt);
//Command = new RelayCommand(() => DoIt()); Equivalent?
}
private DoIt()
{
field.DoSomething();
}
public ICommand Command { get; private set; }
}