2013-08-05 1 views
3

나는 사용자 정의 클래스로 작업하고 있으며 속성을보고 특정 경우에만 반응하는 이벤트 처리기가 있습니다.상속 된 클래스에서 이벤트 핸들러가 작동하는 방식을 어떻게 변경합니까?

public class LoopingPageView : PageView 
{ 
    protected override void OnPageChanged() 
    { 
     if (PageChanged != null && 
      Pages.IndexOf(ActivePage) > 0 && 
      Pages.IndexOf(ActivePage) < Pages.Count - 1) 
      PageChanged(this, Pages.IndexOf(ActivePage) - 1); 
    } 
} 

그러나, 내가 할 수있는 유일한 PageChanged 메시지를 얻을 :

여기
public class PageView 
{ 
    private UIView activePage; 
    public List<UIView> Pages { get; set; } 
    public delegate void PageChangedEventHandler(object sender, PageChangedEventArgs e); 
    public event PageChangedEventHandler PageChanged; 

    public UIView ActivePage 
    { 
     get { return activePage; } 
     set 
     { 
      if (!activePage.Equals(value)) 
      { 
       activePage = value; 
       OnPageChanged(); 
      } 
     } 
    } 

    protected virtual void OnPageChanged() 
    { 
     if (PageChanged != null) 
      PageChanged(this, new PageChangedEventArgs(Pages.IndexOf(activePage))); 
    } 
} 

내가 자식 클래스에서 할 노력하고 무엇 : 여기

는 기본 클래스의 코드 조각입니다 + = 또는 - = 문의 왼쪽에 있습니다. 이 사건을 처리하는 올바른 방법은 무엇입니까?

답변

6

PageChanged은 필드와 비슷한 이벤트입니다. 선언 클래스 바깥에서 - 하위 클래스 내에서도 - 이벤트를 구독하고 이벤트를 구독 취소하는 데만 사용할 수 있습니다.

솔루션은 여기에 일반적으로는 단순히 조건부 OnPageChanged의 기본 구현에 위임하는 것입니다 : 당신은 같은 핸들러에 전달되는 값을 변경하려는이 경우,

public class LoopingPageView : PageView 
{ 
    protected override void OnPageChanged() 
    { 
     int pageIndex = Pages.IndexOf(ActivePage); 
     if (pageIndex > 0 && pageIndex < Pages.Count - 1) 
     { 
      base.OnPageChanged(); 
     } 
    } 
} 

그러나 잘. 현재 설정으로는이 작업을 수행 할 수 없습니다.

경우 정말이 작업을 수행 할 필요가 (그것은 나에게 이상한 것, 그리고 적어도 놀라움의 원칙을 위반 - 서브 클래스가 기본 클래스 다르게 크게 행동) 당신은 아마 걸리는 과부하에 OnPageChanged() 대리자를해야한다 페이지 색인 (또는 - PageChangedEventArgs)을 사용하면 OnPageChanged()의 재정의를 통해 다른 색인으로 호출 할 수 있습니다. 파생 클래스에서 다음

protected virtual void OnPageChanged() 
{ 
    OnPageChanged(new PageChangedEventArgs(Pages.IndexOf(activePage)); 
} 

// Note: this doesn't need to be virtual. 
protected void OnPageChanged(PageChangedEventArgs args) 
{ 
    // Null-safe event raising 
    var handler = PageChanged; 
    if (handler != null) 
    { 
     handler(this, args); 
    } 
} 

: 예를 들어, 답변

protected override void OnPageChanged() 
{ 
    int pageIndex = Pages.IndexOf(ActivePage); 
    if (pageIndex > 0 && pageIndex < Pages.Count - 1) 
    { 
     base.OnPageChanged(new PageChangedEventArgs(pageIndex - 1)); 
    } 
} 
+0

감사합니다. 자식은 이상한 애니메이션을 수행하지 않고도 뷰간에 부드럽게 애니메이션을 적용하는 데 사용되는 추가 두 개의 뷰가 있으므로 두 뷰가 존재하지 않는 것처럼 가장하는 인덱스를 반환하고자합니다. 또한 기본 코드는 [code] base.OnPageChanged (새 PageChangedEventArgs (pageIndex -1)), [/ code] 행에 있거나 필요한 경우 (여전히 사용하고 있습니다.) –

+0

@BlazePhoenix : 아니요, 이전 버전을 변경하지 않고 남겨 두었습니다. 그것은 해를 끼치 지 않는다. –

관련 문제