2014-01-29 4 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.

Я знаю, что это, вероятно, что-то тривиальное, что я пропустил, но я не могу понять это.

EDIT 1

Как было предложено неопределен, я попытался поменять местами строки:

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

без успеха, однако. Тем не менее, Do == null и PerformAction никогда не называются.

EDIT 2

Я попытался eleting пользовательского обработчика и перехода к общей EventHandler, как это было предложено AdamBilinski. Тем не менее, без успеха.

EDIT 3

Я перепроверил и Do нет ссылок нигде в коде.

+1

Есть ли причина, по которой вы используете свой собственный обработчик событий? Почему не просто публичное событие EventHandler Do ;? –

+0

@AdamBilinski, нет. Изменен для EvenHandler, без успеха. Он должен работать, не так ли? – moskalak

ответ

2

Попробуйте поменять местами строки:

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

    view.Show(); 

Подписаться первый, а затем запустить цикл окна (view.Show()).

+0

Спасибо за ваше предложение, но это ничего не изменило. Я обновил свой ответ с подробностями. – moskalak

0

ОК, я решил проблему. Это было крайне тривиально, жаль беспокоить вас.

Один класс, который я еще не показал, был MainClass из Program.cs. Он гласил:

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(); 
    } 
} 

Мораль из этой истории можно сделать, состоит: всегда проверяют все.

Смежные вопросы