Почему мой докладчик не подписан на мое событие просмотра в моем проекте WinForms?

#c# #winforms #events #design-patterns #mvp

#c# #winforms #Мероприятия #шаблоны проектирования #mvp

Вопрос:

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

Я опубликовал свой код ниже.

Я думаю, это как-то связано с тем фактом, что я создаю 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;
    }
  

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

Ответ №1:

Form.Activated Событие запускается только тогда, когда форма видна. Смотрите документацию.

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

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

Комментарии:

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