2014-01-29 6 views
0

모노와 GTK # 로프를 배우는 중입니다.이 문제가 발생했습니다.이벤트를 구독 할 수 없습니다.

상단에서 하단으로 간단한 MVC를 작성하고 있습니다. 즉, 나중에 인터페이스/계약서를 작성합니다. 내가보기 클래스했습니다

public class ScanComparerController 
{ 
    ScanComparerModel model; 
    MainWindow view; 

    public ScanComparerController() 
    { 
     model = new ScanComparerModel(); 
     view = new MainWindow(); 

     view.Show(); 

     view.Do += new MainWindow.DoHandler(PerformAction); 
    } 

    void PerformAction(MainWindow o, EventArgs e) 
    { 
     DoStuff(); 
    } 
} 

:

내가 컨트롤러 클래스를했습니다 지금

public partial class MainWindow: Gtk.Window 
{ 
    public event DoHandler Do; 
    public delegate void DoHandler(MainWindow m, EventArgs e); 

    public MainWindow(): base (Gtk.WindowType.Toplevel) 
    { 
     Build(); 

     btnGo.Clicked += buttonGo_clicked; 
    } 

    void buttonGo_clicked(object o, EventArgs e) 
    { 
     CheckConditions(); 

     if (Do != null) 
      Do (this, EventArgs.Empty); 
    } 

을, 어떤 이유로, 뷰는 항상 동안해야하지, 그 Do == null 믿는다 왜냐하면 나는 초기화 직후 리스너를 추가하기 때문이다. 그래도 내 코드는 정확히 I refer to과 같습니다.

나는 그것이 내가 놓친 부분이있을 거라는 것을 알고 있지만, 나는 그것을 알 수 없다. 그러나 성공하지

view.Do += new MainWindow.DoHandler(PerformAction); 
view.Show(); 

:

편집 정의되지 않은 제안으로 1

, 나는에 선을 교환했습니다. 여전히 Do == nullPerformAction은 호출되지 않습니다.

AdamBilinski에 의해 제안 내가, 사용자 정의 핸들러를 eleting 및 일반 이벤트 핸들러로 전환 시도 2 ​​

편집 할 수 있습니다. 그래도 성공하지 못했습니다.

내가 두 번 확인하고 Do이 코드에서 다른 곳에서 참조되지 않은 3

편집 할 수 있습니다. 라인 교체를

+1

자신 만의 이벤트 핸들러를 사용하는 이유가 있습니까? 왜 그냥 공개 이벤트 EventHandler하지 마; –

+0

@AdamBilinski 전혀 없습니다. 성공없이 EvenHandler로 변경되었습니다. 그것은 작동해야합니다, 그렇죠? – moskalak

답변

2

시도 :

view.Do += new MainWindow.DoHandler(PerformAction); 

    view.Show(); 

Subsribe 먼저, 다음 창주기 (view.Show())를 실행합니다.

+0

제안 해 주셔서 감사합니다.하지만 아무 것도 변경하지 않았습니다. 내 대답을 세부 사항으로 업데이트했습니다. – moskalak

0

그래, 문제가 해결되었습니다. 그것은 매우 사소한 일이었습니다. 귀찮게해서 미안합니다.

내가 보여주지 않은 한 클래스는 Program.cs의 MainClass입니다. 그것은 읽어 그려 될이 이야기에서

class MainClass 
{ 
    public static void Main (string[] args) 
    { 
     Application.Init(); 
     var controller = new ScanComparerController(); 
     Application.Run(); 
    } 
} 

도덕적 :

class MainClass 
{ 
    public static void Main (string[] args) 
    { 
     Application.Init(); 
     MainWindow win = new MainWindow(); 
     win.Show(); 
     Application.Run(); 
    } 
} 

을 변경하여 해결 는 항상 모든을 확인합니다.

관련 문제