简体   繁体   English

方法未绑定到 C# 中的事件处理程序

[英]Method doesnt bind to event handler in C#

Im trying to use MVC pattern in winforms but when I try invoke event it is always null.我试图在 winforms 中使用 MVC 模式,但是当我尝试调用事件时,它总是 null。 I pass GameView form to Game class to which I bind CityButtonPressed method to event but when I run it it seems like if nothing was binded.我将 GameView 表单传递给 Game class ,我将 CityButtonPressed 方法绑定到事件,但是当我运行它时,似乎没有任何绑定。

public partial class GameView : Form,IGameView
{
    public event EventHandler CityButtonPressed;

    public GameView()
    {
        InitializeComponent();
    }


    private void button3_Click(object sender, EventArgs e)
    {

    }

    protected virtual void OnButtonPressed(EventArgs e)
    {
        if (CityButtonPressed == null)   <----its always null
            MessageBox.Show("null");  
        CityButtonPressed?.Invoke(this, e);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        OnButtonPressed(EventArgs.Empty);
    }
}

even though i bind it here即使我把它绑定在这里

class Game
{
    private readonly IGameView _gameView;
    private CityMenuView _cityMenuView = new CityMenuView();
    private List<Mesto> citiesList = new List<Mesto>();


    public Game(IGameView view)
    {
        _gameView = view;
        citiesList.Add(new Mesto("Bratislava"));
        citiesList.Add(new Mesto("Praha"));
        citiesList.Add(new Mesto("Brno"));

        _gameView.CityButtonPressed += CityButtonPressed;

    }

    public void CityButtonPressed(object sender,EventArgs e)
    {
        _cityMenuView.MestoName = "Bratislava";
        _cityMenuView.ShowDialog();
    }
}

What am I doing wrong?我究竟做错了什么?

Here's a cut down version of your code that shows it works .这是您的代码的精简版本,表明它有效

void Main()
{
    var view = new GameView();
    var game = new Game(view);
    view.OnButtonPressed();
}

public interface IGameView
{
    event EventHandler CityButtonPressed;
}

class Game
{
    private readonly IGameView _gameView;


    public Game(IGameView view)
    {
        _gameView = view;
        _gameView.CityButtonPressed += CityButtonPressed;
    }

    public void CityButtonPressed(object sender, EventArgs e)
    {
        Console.WriteLine("Pressed");
    }
}

public partial class GameView : IGameView
{
    public event EventHandler CityButtonPressed;

    public void OnButtonPressed()
    {
        if (CityButtonPressed == null) 
            Console.WriteLine("null");
        CityButtonPressed?.Invoke(this, new EventArgs());
    }
}

When I run that I get Pressed on the console.当我运行它时,我在控制台上被Pressed All I did is refactor your code to get it down to the minimal amount required for it to run.我所做的只是重构您的代码,使其降至运行所需的最小量。

It would seem you're not wiring it up correctly or your not showing us the actual minimal amount of code required.看起来您没有正确连接它,或者您没有向我们展示所需的实际最少代码量。

Make sure that the Game class is initialized with the GameView instance before you invoke CityButtonPressed .在调用 CityButtonPressed 之前,确保使用GameView实例初始化Game CityButtonPressed For example:例如:

private Game game;
    protected virtual void OnButtonPressed(EventArgs e)
    {
      game=  new Game(this);
        if (CityButtonPressed == null)   
            MessageBox.Show("null");  
        CityButtonPressed?.Invoke(this, e);
    }

It is not a good solution for you because you will need the Game instance somewhere but the CityButtonPressed should not be null anymore.这对您来说不是一个好的解决方案,因为您将在某处需要Game实例,但CityButtonPressed不应再为 null。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM