【发布时间】:2016-09-15 02:07:04
【问题描述】:
背景
问题标题可能有点误导,但我不知道如何快速提出问题。我正在构建一个 winforms 应用程序并遵循 MVP 设计模式,带有被动视图。在我的应用程序的主视图(表单)中,有一个导航面板,其中包含按钮,单击这些按钮将打开另一个视图(表单)。我正在尝试创建泛型按钮:
// The type T represents the view (form) that should be opened when the button is clicked
NavigationButton<T>
主视图的演示者在运行时单独创建每个按钮:
// Code in Main Presenter - register each button
View.RegisterNavigationButton(new NavigationButton<IViewExample1>("Example 1")); // Pass in text to show on button
View.RegisterNavigationButton(new NavigationButton<IViewExample1>("Example 2"));
// Code in View
public void RegisterNavigationButton<T>(NavigationButton<T> button) where T : class, IView
{
// Add button to flow layout panel
_flpNavigation.Controls.Add(button);
// Subscribe to click event
button.Clicked += ButtonClicked<T>;
}
现在,如果这不是被动视图,当单击导航按钮时,您可能会继续从主视图直接创建新视图:
// This is the method subscribed to the click event as shown in the above code
private void ButtonClicked<T>(object sender, EventArgs e) where T : class, IView
{
// The ApplicationController creates the new view (form) using an IoC container (Simple Injector)
ApplicationController.ShowModelessForm<T>();
}
但是,这是一个被动视图,所以它不应该创建新的视图(表单)...
我的每个视图都实现了一个接口,演示者通过该接口持有对其随附视图的引用。视图接口定义了演示者可以订阅的事件。也就是说,presenter 可以直接从视图中调用方法,只要在接口中定义了方法,但是视图必须引发事件才能与 Presenter 进行通信。
问题
考虑到这种设置,我将如何与演示者沟通它应该创建一个新视图?我的每个视图都实现了一个接口,演示者通过该接口持有对其随附视图的引用。视图接口定义了演示者可以订阅的事件。给定我的通用设置,是否可以设置某种事件来与演示者交流以创建视图?
** 编辑 **
我的障碍是我不知道如何定义要引发的事件,以及如何引发它们。假设我有两个要打开的辅助视图,由以下视图定义:IView1 和 IView2。我是否必须在主视图中定义两个单独的事件处理程序,每个辅助视图一个?然后,单击按钮后,如何引发相应的事件?
【问题讨论】:
-
我不确定我是否理解最后一个问题,因为您似乎已经确定了一种机制,可以以被动表单上定义的事件的形式与演示者进行交流。您在定义或提出这些事件时是否有具体问题?请添加更多关于您当前包版的性质的详细信息。
-
感谢@Luc 的回复。我对我的问题进行了编辑!
标签: c# winforms generics simple-injector