2010-11-30 3 views
2

저는 PRISM RegionManager에 두 개의 영역, 즉 맨 위에 리본 영역이 있고 그 아래에 내 뷰의 주 컨텐츠 영역이 있습니다.WPF PRISM 이벤트 서브 스크립 션이 죽지 않는 경우

앱이 주 콘텐츠 영역에서 '집'보기로 시작합니다. 리본에서 버튼을 클릭하면 내용 영역에 두 번째보기를 삽입하고 영역 관리자에서 두 번째보기로 이동합니다. 이보기에서 단추를 클릭하면 제거해야하며 원래보기가 표시되어야합니다.

저는 현재 RegionManager.Add() 메소드를 사용하여 수동으로 두 번째보기를 추가하고 있습니다. 이를 제거하려면 현재 활성 제거를 가져 오는 관리자 클래스에 의해 소비되는 이벤트를 게시하고 Region Manager에서 Remove()를 호출 한 다음 다시 원래 뷰로 이동합니다.

Remove()를 호출 한 후 두 번째보기가 활성 상태로 유지되고 수명 기간 동안 이루어진 모든 구독을 처리한다는 점을 제외하면이 모든 기능이 뛰어납니다! 약한 이벤트 참조에 대해 Subscribe를 명시 적으로 false로 호출 해 보았습니다. 그러나 이것은 기본 값이며 어쨌든 도움이되지 않았습니다. 보기 생성 (검색 및 삽입)과 제거 및 비활성화를 통한보기 제거의 두 가지 유형 모두를 시도했습니다. 그들 중 누구도 도왔다. 이것은 미래에 동일한 뷰 (해당 뷰의 새로운 인스턴스)를 만들고 싶을 때와 같은 몇 가지 인스턴스가 남았습니다. 모두 동일한 이벤트를 구독합니다. 일부 인스턴스는 지역 매니저에서 이전에 제거되었습니다.

내가보기에 구독하는 모든 이벤트를 수동으로 구독 취소해야합니까 (매우 바람직하지 않음)? 아니면 컨트롤을 처분 할 수있는 방법이 있습니까?/비활성화 된 것으로 표시하여 구독을 제거 할 수 있습니까?

나는 여기 바보 같은 짓을하고 있다는 느낌이 들지만, 완전히 저음을 줬다.

감사합니다.

답변

1

이것은 알려진 문제입니다. eventAggregator 코드에 버그가 있습니다. 그냥 게시물을 통해 읽고 버그를 발견하고 제안 된 해결 방법을 사용 - -이 http://greenicicleblog.com/2010/04/28/prism-event-aggregator-more-leaky-than-it-seems/

희망이가 머리에 대한

+0

감사합니다 도움이 극복하기 위해 다음 블로그와 제안 된 해킹을 살펴보십시오이 동안 PRISM이 약한 참조를 사용하도록 강요하지만 불행히도 나는 여전히 같은 행동을하고있다 :-( –

+0

나는이 문제를 좀 더 근본적으로 생각한다. 충분히 오래 기다리면, 약한 참조는 이벤트 구독 서비스에서 삭제됩니다. 그러나 삭제되지 않은 경우 - 그리고 언제 그럴 수 있는지 알 수 없으면 오래된 구독이 숨어서 모든 종류의 이벤트를 수신 할 수 있습니다. 뷰를 닫거나 새로운 인스턴스를 만드는 대신보기의 단일 인스턴스를 다시 사용할 때마다 수동으로 구독을 취소하는 경로를 따라야한다고 생각합니다. 어느 쪽도 나에게 많이 호소하지 않는다. –

+1

@Isaac Abraham : 약한 참조가 유지되면 가비지 수집기가 따라 와서 해당 개체를 정리할 때까지 유효합니다. 즉각적인 탈퇴를 원한다면 불행히도 탈퇴를 수동으로해야합니다. –

관련 문제