#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. Спасибо, я исправил это сейчас! Не осознавал этого.