2010-07-18 6 views
2

초기화 방법과 완료된 이벤트가 모두 정적 인 비동기 호출을 처리하기 위해 Reactive Extensions를 사용하여 코드를 작성하려고합니다. LanguageManager는 정적 클래스가 아닌 인스턴스이기 때문에 나는Observable.FromEvent를 정적 이벤트와 함께 사용하는 방법?

var languageSetsLoaded = Observable 
    .FromEvent<LoadLanguageSetsCompletedEventArgs>(
    LanguageManager, "LanguageSetsLoaded") 

을 사용할 수 없습니다, 그래서 나는

var languageSetsLoaded = Observable 
    .FromEvent<LoadLanguageSetsCompletedEventArgs>(
    h => LanguageManager.LanguageSetsLoaded += h, 
    h => LanguageManager.LanguageSetsLoaded -= h) 

을 시도하지만 그 때문에 '객체'를 입력 변환 할 수 없습니다 "람다 식을 구문 오류가 있습니다 델리게이트 형식이 아닙니다. " 이벤트는 이렇게 선언되었습니다.

public delegate void LoadLanguageSetsCompletedHandler(LoadLanguageSetsCompletedEventArgs e); 
public static event LoadLanguageSetsCompletedHandler LanguageSetsLoaded = delegate { }; 

그래서 저는 이것이 델리게이트 형식이며 실제로 정적이라는 사실은 오해의 소지가있는 오류 설명을 생성하고 있다고 생각합니다.

이렇게하는 방법이 있습니까? 아니면 이런 반응이없는 코드를 사용해야할까요?

private void ChangeLanguage(string languageCode) 
{ 
    LanguageManager.LanguageSetsLoaded += OnLanguageSetsLoaded; 
    LanguageManager.LoadLanguageSets(languageCode, BaseApp.InTranslationMode); 
} 

private void OnLanguageSetsLoaded(LoadLanguageSetsCompletedEventArgs e) 
{ 
    LanguageManager.LanguageSetsLoaded -= OnLanguageSetsLoaded; 
    OnPropertyChanged("DummyLanguageResource"); 
} 

답변

3

문제는 위젯 유형의 이벤트라고 생각합니다.

public static IObservable<IEvent<TEventArgs>> FromEvent<TEventArgs>(
    Action<EventHandler<TEventArgs>> addHandler, 
    Action<EventHandler<TEventArgs>> removeHandler 
) 
where TEventArgs : EventArgs 

는 다른 방법이 세 가지가 있습니다 과부하를 사용할 수 있습니다

public static event EventHandler<LoadLanguageSetsCompletedEventArgs> 
    LanguageSetsLoaded = delegate { }; 

당신이 사용하려는 Observable.FromEvent의 서명을 보면, 그것은 다음과 같습니다 :로 변경합니다 인수, 첫 번째는 변환 처리기입니다.하지만 가능하다면 이벤트 서명을 변경하는 것이 좋습니다.

관련 문제