【问题标题】:Why is my Presenter not subscribed to my View event in my WinForms project?为什么我的 Presenter 没有订阅我的 WinForms 项目中的 View 事件?
【发布时间】:2016-10-10 13:29:51
【问题描述】:

我正在尝试在我的 WinForms 项目中实现 MVP 模式。但是,从我的视图订阅我的 'ActivatedForm' 事件的 Presenter 中的方法 'Activate' 在我加载表单时似乎没有触发。我只是通过在“激活”方法中打印一些东西来测试它。为什么这不能正常工作?

我在下面发布了我的代码。

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

希望有人能帮忙,谢谢。

【问题讨论】:

    标签: c# winforms events design-patterns mvp


    【解决方案1】:

    Form.Activated 事件仅在表单可见时触发。见the documentation

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

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

    【讨论】:

    • 谢谢,我已经修好了!没有意识到这一点。
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    相关资源
    最近更新 更多