如果在一個XAML文件,我結合從下面的類一個按鈕「命令」,然後單擊按鈕不會導致執行DOIT:RelayCommand參數
class Thing()
{
public Thing(Foo p1)
{
Command = new RelayCommand(() => DoIt(p1));
}
private DoIt(Foo p)
{
p.DoSomething();
}
public ICommand Command { get; private set; }
}
然而,
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; }
}
爲什麼前者失敗,但後者按預期方式工作:如果我初始化從P1的一個字段,字段作爲參數傳遞給方法調用的拉姆達裏面它的工作?
也許相關:How do closures work behind the scenes? (C#)
編輯:爲了澄清,下面也會爲我工作。然而,我仍然想知道爲什麼第二個例子能夠達到我的預期,但第一個例子沒有。
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; }
}
我不想接受來自綁定的參數。也就是說,我希望Thing被賦予一個構造函數參數,並且我希望該參數的值在DoIt中使用。我可以使DoIt無參數,將構造函數參數p1賦值給一個字段,並使用DoIt中的字段(而不是將該字段的值作爲參數傳遞給DoIt),但是我想明確地知道這裏發生了什麼。 – theguy
@theguy我看到了。問題是創建lamda表達式會創建一個匿名的內部方法,然後調用它。你可以看到它: 'public Thing(Foo p1) { Command = new RelayCommand(AnonymousMeth()); } 私人空白AnonymousMeth() { DoIt(p1); }' 因此lamda表達式生成的方法不知道如何處理p1。您可以(正確描述)通過使用專用字段來避免此問題。 – Alexx01