Reputation: 5248
I have litle problem with event in MVP
view and presenter.
When _artistToolbarButton_Click
event is fired he start show me another registred events. Why does this happen? Check animation and you will see antoher message box from another event is also fired!
Here is my form code:
Form:
public partial class MainForm : Form, IMainView
{
#region Properties
public IPresenter Presenter { get; set; }
#endregion
// Constructor
public MainForm()
{
this.InitializeComponent();
this.Presenter = new MainPresenter(this);
this.WireEvents();
}
public event EventHandler<EventArgs> OnLoad;
public event EventHandler<EventArgs> ShowArtist;
public event EventHandler<EventArgs> ShowLibrary;
public event EventHandler<EventArgs> ShowTopList;
// Wire events
private void WireEvents()
{
this.Load += new EventHandler(MainForm_Load);
this._artistToolbarButton.Click += new EventHandler(_artistToolbarButton_Click);
this._libraryToolbarButton.Click += new EventHandler(_libraryToolbarButton_Click);
this._topListToolbarButton.Click += new EventHandler(_topListToolbarButton_Click);
}
#region Events
// Load
private void MainForm_Load(object sender, EventArgs e)
{
if(this.OnLoad != null)
{
this.OnLoad(this, EventArgs.Empty);
}
}
// Artist
private void _artistToolbarButton_Click(object sender, EventArgs e)
{
if (this.ShowArtist != null)
{
this.ShowArtist(this, EventArgs.Empty);
}
}
// Library
private void _libraryToolbarButton_Click(object sender, EventArgs e)
{
if (this.ShowLibrary != null)
{
this.ShowLibrary(this, EventArgs.Empty);
}
}
// Top list
private void _topListToolbarButton_Click(object sender, EventArgs e)
{
if (this.ShowTopList != null)
{
this.ShowTopList(this, EventArgs.Empty);
}
}
#endregion
}
public class MainPresenter : IPresenter
{
private IMainView _view;
// Constructor
public MainPresenter(IMainView view)
{
this._view = view;
this.WireEvents();
}
// Wire events
public void WireEvents()
{
this._view.OnLoad += OnLoad;
this._view.ShowArtist += ShowArtist;
this._view.ShowArtist += ShowLibrary;
this._view.ShowArtist += ShowTopList;
}
// On load
private void OnLoad(object sender, EventArgs e)
{
MessageBox.Show("OnLoad");
}
// ShowArtist
private void ShowArtist(object sender, EventArgs e)
{
MessageBox.Show("ShowArtist");
}
// ShowLibrary
private void ShowLibrary(object sender, EventArgs e)
{
MessageBox.Show("ShowLibrary");
}
//ShowTopList
private void ShowTopList(object sender, EventArgs e)
{
MessageBox.Show("ShowTopList");
}
}
Presenter:
public class MainPresenter : IPresenter
{
private IMainView _view;
// Constructor
public MainPresenter(IMainView view)
{
this._view = view;
this.WireEvents();
}
// Wire events
public void WireEvents()
{
this._view.OnLoad += OnLoad;
this._view.ShowArtist += ShowArtist;
this._view.ShowArtist += ShowLibrary;
this._view.ShowArtist += ShowTopList;
}
// On load
private void OnLoad(object sender, EventArgs e)
{
MessageBox.Show("OnLoad");
}
// ShowArtist
private void ShowArtist(object sender, EventArgs e)
{
MessageBox.Show("ShowArtist");
}
// ShowLibrary
private void ShowLibrary(object sender, EventArgs e)
{
MessageBox.Show("ShowLibrary");
}
//ShowTopList
private void ShowTopList(object sender, EventArgs e)
{
MessageBox.Show("ShowTopList");
}
}
Upvotes: 0
Views: 139
Reputation: 12171
You should properly subscribe to events in Presenter:
public void WireEvents()
{
this._view.OnLoad += OnLoad;
this._view.ShowArtist += ShowArtist; // this._view.ShowArtist
this._view.ShowLibrary += ShowLibrary; // this._view.ShowArtist
this._view.ShowTopList += ShowTopList; // this._view.ShowArtist
}
Upvotes: 1
Reputation: 567
Change your code into this one:
// Wire events
public void WireEvents()
{
this._view.OnLoad += OnLoad;
this._view.ShowArtist += ShowArtist;
this._view.ShowLibrary += ShowLibrary;
this._view.ShowTopList += ShowTopList;
}
It's simply a event link error :)
Upvotes: 2