无法订阅活动

时间:2014-01-29 11:07:39

标签: c# mono gtk#

我只是学习单声道和GTK#的绳索,我遇到了这个问题。

我正在构建一个简单的MVC - 从顶部到底部(即我稍后将构建接口/合约)。

我是一个Controller类:

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

根据undefined的建议,我尝试将这些行换成:

view.Do += new MainWindow.DoHandler(PerformAction);
view.Show ();
但是,没有成功。但是,永远不会调用Do == nullPerformAction

编辑2

我尝试使用自定义处理程序并切换到通用EventHandler,如AdamBilinski所建议的那样。仍然没有成功。

编辑3

我仔细检查过,Do未在代码中的任何其他位置引用。

2 个答案:

答案 0 :(得分:2)

尝试交换线条:

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

   view.Show ();

先订阅,然后运行窗口周期(view.Show ())。

答案 1 :(得分: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 ();
    }
}

这个故事的寓意是:总是检查一切