我只是学习单声道和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 == null
和PerformAction
。
编辑2
我尝试使用自定义处理程序并切换到通用EventHandler,如AdamBilinski所建议的那样。仍然没有成功。
编辑3
我仔细检查过,Do
未在代码中的任何其他位置引用。
答案 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 ();
}
}
这个故事的寓意是:总是检查一切。