lundi 10 octobre 2016

Why is my Presenter not subscribed to my View event in my WinForms project?

I am trying to implement the MVP pattern into my WinForms project. However, the method 'Activate' in my Presenter that is subscribed to my 'ActivatedForm' event from my View, does not seem to fire when i load the form. I have tested it simply by printing someting in the 'Activate' method. Why is this not working properly?

I have posted my code below.

I think it has something to do with the fact that I am creating the Presenter with the concrete View even though the _view attribute is of the interface type 'IHomeScreenView'. I know that the 'HomeScreenView_Activated' event occurs, because I have put a print in there too and that worked. The 'ActivatedForm' event just always returns null there which means that nothing is subscribed to the event.

IHomeScreenView.cs

public interface IHomeScreenView
{
    List<string> ExistingAssessments { get; set; }

    event EventHandler<EventArgs> ActivatedForm;
    event EventHandler<EventArgs> CreatingNewAssessment;
    event EventHandler<EventArgs> AddingNewStandard;
    event EventHandler<EventArgs> OpeningAssessment;
}

HomeScreenView.cs

public partial class HomeScreenView : Form, IHomeScreenView
{
    private HomeScreenPresenter homeScreenPresenter;

    public List<string> ExistingAssessments
    {
        get { return recentAssessments.Items.Cast<string>().ToList(); }
        set { recentAssessments.DataSource = value; }
    }

    public event EventHandler<EventArgs> ActivatedForm;
    public event EventHandler<EventArgs> CreatingNewAssessment;
    public event EventHandler<EventArgs> AddingNewStandard;
    public event EventHandler<EventArgs> OpeningAssessment;

    // Initialize homescreen.
    public HomeScreenView()
    {
        InitializeComponent();
    }

    // Fires the activating form event.
    private void HomeScreenView_Activated(object sender, EventArgs e)
    {
        ActivatedForm?.Invoke(this, EventArgs.Empty);
    }

HomeScreenPresenter.cs

public class HomeScreenPresenter
{
    private IHomeScreenView _view;
    private AssessmentsModel _assessmentsModel;

    public HomeScreenPresenter(IHomeScreenView view)
    {
        _assessmentsModel = new AssessmentsModel();
        _view = view;
        _view.ActivatedForm += Activate;
        _view.CreatingNewAssessment += CreateNewAssessment;
        _view.AddingNewStandard += AddNewStandard;
        _view.OpeningAssessment += OpenAssessment;
    }

    public void Activate(object sender, EventArgs e)
    {
        Debug.Print("hi");
        HashSet<string> items = new HashSet<string>(_assessmentsModel.GetDataList("Assessments", "assessment_name"));
        List<string> assessments = items.ToList();

        _view.ExistingAssessments = assessments;
    }

I hope someone can help, thank you.

Aucun commentaire:

Enregistrer un commentaire