2016-10-10 6 views
0

Я пытаюсь реализовать шаблон MVP в моем проекте WinForms. Однако метод «Активировать» в моем презентаторе, подписанный на мое событие «ActivatedForm» из моего представления, похоже, не срабатывает при загрузке формы. Я протестировал его просто, напечатав someting в методе «Активировать». Почему это работает неправильно?Почему мой презентатор не подписался на мое событие View в моем проекте WinForms?

Я разместил свой код ниже.

Я думаю, что это связано с тем, что я создаю Presenter с конкретным представлением, даже если атрибут _view имеет тип интерфейса «IHomeScreenView». Я знаю, что происходит событие «HomeScreenView_Activated», потому что я тоже там распечатал и это сработало. Событие «ActivatedForm» всегда возвращает null, что означает, что на событие ничего не подписано.

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; 
    } 

Надеюсь, кто-то может помочь, спасибо.

ответ

0

Событие Form.Activated выставлено только в том случае, если форма видна. См. the documentation.

Когда приложение активно и имеет несколько форм, активная форма представляет собой форму с фокусом ввода. Форма, которая не видна, не может быть активной формой. Самый простой способ активировать видимую форму - щелкнуть по ней или использовать соответствующую комбинацию клавиш.

Если ваша форма уже видна при создании ведущего, активированное событие уже запущено. Вы можете позвонить Form.Activate() после создания ведущего и подключиться к нему.

+0

Спасибо, я исправил его сейчас! Не понял этого. –