2016-11-21 1 views
2

나는 이것 이외의 방법으로 람다를 사용하는 데 익숙하다. DelegateCommand을 정의하고 정의 할 때 명령에 대해 묶는 유형의 비 정적 구성원에 액세스해야합니다. 예 :DelegateCommand의 Execute 대리자에서 인스턴스 속성에 액세스 할 수없는 이유는 무엇입니까?

에 액세스 할 수 없습니다 비 정적 속성 App을에 : 위의 코드에서

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 빨간색이 구불 구불하고 유혹에, 나는 듣는다 밑줄이 정적 컨텍스트.

이것은 클로저에 람다를 사용할 때 익숙하지 않은 동작입니다. 여기 다른 점은 무엇입니까?

답변

7

자동 구현 속성 초기화 프로그램에서 인스턴스 멤버에 액세스하려고합니다. 이것은 필드 초기화 프로그램에서 그렇게하려고하는 것과 같습니다. 기본적으로 람다 식에서조차도 암시 적으로 이니셜 라이저로 this을 참조 할 수 없습니다. 대신 생성자에서이 작업을 수행해야합니다.

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

관련 문제