为什么我的演示者没有订阅我的视图事件在我的WinForms项目

本文关键字:我的 事件 视图 WinForms 项目 为什么 | 更新日期: 2023-09-27 18:12:25

我试图实现MVP模式到我的WinForms项目。然而,方法'激活'在我的演示器订阅我的'ActivatedForm'事件从我的视图,似乎不火,当我加载表单。我只是通过在"激活"方法中打印一些东西来测试它。为什么这个不能正常工作?

我把我的代码贴在下面。

我认为这与我正在用具体视图创建演示器的事实有关,即使_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;
    }

我希望有人能帮忙,谢谢。

为什么我的演示者没有订阅我的视图事件在我的WinForms项目

Form.Activated事件仅在表单可见时触发。参考文档

当应用程序处于活动状态并且有多个表单时,活动表单是具有输入焦点的表单。不可见的表单不能是活动表单。激活可见表单的最简单方法是单击它或使用适当的键盘组合。

如果在创建演示者时表单已经可见,则激活的事件已经触发。您可以在创建演示者并连接事件处理程序后调用Form.Activate()