2016-11-21 45 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

相关问题