2012-06-22 7 views
2

이벤트에서 익명 메서드를 구독 취소하는 방법을 알고 싶습니다.익명 대리인에 대한 구독 취소

나는 이미 Unsubscribe anonymous method in C#을 확인했지만 내 경우는 조금 다릅니다.

익명 메소드에서 로컬 함수 변수에 액세스 중입니다. 당신은 익명의 대표로 그렇게하지

private static void Test(Object dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs) 
    { 
     if (dependencyPropertyChangedEventArgs.OldValue is ObservableCollection<object>) 
     { 
      (dependencyPropertyChangedEventArgs.OldValue as ObservableCollection<object>).CollectionChanged -= 
       (s, e) => SelectedItemsChanged(dependencyObject, e); // TO FIX event unbsubscription via anonymous delegate 
     } 

     if (dependencyPropertyChangedEventArgs.NewValue is ObservableCollection<object>) 
     { 
      (dependencyPropertyChangedEventArgs.NewValue as ObservableCollection<object>).CollectionChanged += 
       (s, e) => SelectedItemsChanged(dependencyObject, e); 
     } 
    } 
+1

귀하의 케이스는 어떤 점에서 다른가요? 당신은 단순히 이것을 할 수 없습니다 - 그것은 효과가 없을 것입니다. http://stackoverflow.com/questions/1348150/how-do-i-unregister-anonymous-event-handler도 참조하십시오. –

+0

차이점은 함수에 대한 변수 로컬 액세스를 제공해야한다는 것입니다. 명명 된 메서드를 사용하도록 선택한 경우이 변수를 전달하는 방법 – Tilak

답변

1

새로운 대답은, 이제 문제는 기본적으로, 당신은 할 수 없습니다

을 변경했습니다. 처리기는 dependencyObject에 따라 달라지며 각 호출에서 새 개체에 캡처되므로 불평등 한 대리자가됩니다.

당신은 종속성 개체 를 보유하고 익명 함수를 사용하는 대신 해당 개체을 비교 Equals을 재정의하는 새로운 클래스를 만들 수 있습니다, 또는 당신은 이전에 등록 된 핸들러에 대한 참조를 개최 할 수있다. 대리인이 매개 변수

기괴한 것은 당신이 어떤 지역 변수를 캡처하지 않는 것처럼이 특정한 경우에, 보이는 것입니다에 의존하지 않았다


올드 대답. 그래서 당신이 이벤트에 가입하고있는 곳이 방법에서하는 경우, 당신이 멀리 얻을 수 : 당신은 지금 하나 람다 식을 가지고로서

private static void Test(Object a, DependencyPropertyChangedEventArgs args) 
{ 
    NotifyCollectionChangedEventHandler handler = 
     (s, e) => SelectedItemsChanged(dependencyObject, e); 

    var oldObservable = args.OldValue as ObservableCollection<object>; 
    if (oldObservable != null) 
    { 
     oldObservable.CollectionChanged -= handler; 
    } 
    var newObservable = args.NewValue as ObservableCollection<object>; 
    if (newObservable != null) 
    { 
     newObservable.CollectionChanged += handler; 
    } 
} 

, 하나의 정적 메서드로 변환해야하므로 새로 만든 대리자는 원래의 메서드와 동일 할 것입니다.

그러나 을 권장하지 않습니다. 난 그냥 직접 메서드를 만들고 다음 메서드 그룹 변환을 사용하십시오.

+0

내 질문에 오타가있었습니다. 첫 번째 매개 변수는 dependencyObject 여야합니다 (a가 아님). 메서드 그룹 변환을 사용하는 방법 (및 메서드에 dependencyObject 전달)? – Tilak

+0

@Tilak :이 경우에는 할 수 없으며 대신 핸들러를 저장해야합니다. 내가 편집 할게. –

+0

@Tilak : 미래에 변경 사항이 의미와 중요한 차이가 나는 경우 내 대답을 편집하지 마십시오. 그 결과 코드가 * 작동하지 않았으며 내 설명으로도 젤화되지 않았습니다. –

2

아래로

코드입니다. 수신 거부 수 있으려면 평소 대표자를 사용해야합니다.

관련 문제