2014-01-29 130 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

我知道這可能是我錯過的小事,但我無法弄清楚。

編輯1

正如所建議的定義,我想換行到:

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

沒有成功,但是。從來沒有調用Do == nullPerformAction

EDIT 2

我試着eleting自定義處理程序,並切換到普通的事件處理程序,通過AdamBilinski的建議。但是,沒有成功。

編輯3

我雙重檢查和Do沒有在代碼的其他地方引用。

+1

您有使用自己的事件處理程序的原因嗎?爲什麼不只是公共事件EventHandler Do;? –

+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(); 
     MainWindow win = new MainWindow(); 
     win.Show(); 
     Application.Run(); 
    } 
} 

解決了通過更改爲:

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

道德從這個故事可以得出的是:經常檢查一切