2016-11-21 51 views
2

我習慣於以明顯不同於此的方式使用lambdas。當我嘗試並定義一個DelegateCommand時,我必須訪問該命令的封閉類型的非靜態成員。例如:爲什麼我不能在DelegateCommand的Execute委託中訪問實例屬性?

public ICommand ShowViewCommand { get; set; } = new DelegateCommand<string>(v => 
    { 
     var viewModel = new EditFormViewModel; 
     var ucType = Assembly.GetExecutingAssembly().GetType(v); 
     App.SetWindowView(viewModel, ucType); 
    }, 
v => true); 

在上面的代碼,在App.SetWindowView通話,App有一個紅色波浪下劃線,並在上空盤旋了,有人告訴我:

不能訪問非靜態屬性App在靜態上下文。

這不是我習慣使用lambdas進行關閉的行爲。這裏有什麼不同?

回答

7

您試圖訪問自動實現的屬性初始值設定項內的實例成員。這就像在字段初始化器中試圖這樣做。基本上,您甚至不能在初始化器中隱式引用this,即使在lambda表達式中也是如此。相反,您需要在構造函數中執行此操作:

public ICommand ShowViewCommand { get; set; } 

public Foo() // Replace with your class name 
{ 
    ShowViewCommand = v => new DelegateCommand<string>(v => 
    { 
     var viewModel = new EditFormViewModel; 
     var ucType = Assembly.GetExecutingAssembly().GetType(v); 
     App.SetWindowView(viewModel, ucType); 
    }); 
} 
+0

Aaah,謝謝Jon。我對C#6允許使用自動屬性初始值設定項這一事實感到失望。現在我記得幾年前我上一次使用WPF的時候,我在構造函數中構建了這些命令,而我從來沒有意識到你不能在初始化器中完成它。不是你需要它,但我希望我能給你一個這樣的獎勵,這個問題是一個令人驚愕的一週的問題。 – ProfK

相關問題