为什么我的 Presenter 没有订阅我的 WinForms 项目中的 View 事件?
Why is my Presenter not subscribed to my View event in my WinForms project?
我正在尝试将 MVP 模式实施到我的 WinForms 项目中。但是,我的 Presenter 中的方法 'Activate' 从我的视图订阅了我的 'ActivatedForm' 事件,当我加载表单时似乎没有触发。我只是通过在 'Activate' 方法中打印一些东西来测试它。为什么这不能正常工作?
我已经在下面发布了我的代码。
我认为这与我创建带有具体视图的演示者有关,即使_view 属性是接口类型'IHomeScreenView'。
我知道 'HomeScreenView_Activated' 事件发生了,因为我也在那里放了一个打印件并且有效。
'ActivatedForm' 事件总是 returns 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;
}
希望有人能帮忙,谢谢
Form.Activated
事件仅在表单可见时触发。参见 the documentation。
When the application is active and has multiple forms, the active form is the form with the input focus. A form that is not visible cannot be the active form. The simplest way to activate a visible form is to click it or use an appropriate keyboard combination.
如果创建演示者时您的表单已经可见,则激活事件已经触发。一旦创建了演示者并连接了事件处理程序,您就可以调用 Form.Activate()
。
我正在尝试将 MVP 模式实施到我的 WinForms 项目中。但是,我的 Presenter 中的方法 'Activate' 从我的视图订阅了我的 'ActivatedForm' 事件,当我加载表单时似乎没有触发。我只是通过在 'Activate' 方法中打印一些东西来测试它。为什么这不能正常工作?
我已经在下面发布了我的代码。
我认为这与我创建带有具体视图的演示者有关,即使_view 属性是接口类型'IHomeScreenView'。 我知道 'HomeScreenView_Activated' 事件发生了,因为我也在那里放了一个打印件并且有效。 'ActivatedForm' 事件总是 returns 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;
}
希望有人能帮忙,谢谢
Form.Activated
事件仅在表单可见时触发。参见 the documentation。
When the application is active and has multiple forms, the active form is the form with the input focus. A form that is not visible cannot be the active form. The simplest way to activate a visible form is to click it or use an appropriate keyboard combination.
如果创建演示者时您的表单已经可见,则激活事件已经触发。一旦创建了演示者并连接了事件处理程序,您就可以调用 Form.Activate()
。