背景
问题标题可能有点误导,但我不确定如何快速提出问题。我正在构建一个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>();
}
但是,这是一种被动的观点,所以它不应该创造新的观点(形式)......
我的每个视图都实现了一个界面,并且演示者通过该界面持有对其附带视图的引用。视图接口定义演示者可以订阅的事件。换句话说,只要在接口中定义了方法,演示者就可以直接从视图中调用方法,但视图必须引发事件以与演示者进行通信。
问题
考虑到这种设置,我将如何与演示者沟通它应该创建一个新视图?我的每个视图都实现了一个界面,并且演示者通过该界面保存对其附带视图的引用。视图接口定义演示者可以订阅的事件。是否可以设置某种事件来传达演示者以根据我的通用设置创建视图?
** 编辑 **
我的障碍是,我不知道如何定义要引发的事件,以及如何引发它们。假设我有两个要打开的辅助视图,由以下视图定义:IView1和IView2。我是否必须在主视图中定义两个单独的事件处理程序,每个辅助视图一个?然后,单击按钮后,如何引发相应的事件?
答案 0 :(得分:3)
您决定事件处理程序需要什么。查看按钮的用途并引发相应的事件。如果您有多个具有相同目的的按钮,请让它们引发相同的事件。如果您有另一个与该按钮具有相同目的的操作,请再次举起相同的事件。
您举起的活动与该按钮的目的相关联,并且基本上不知道因举办活动而可能发生的任何事情。
该活动可能更直接&#34;详情按钮点击&#34;或更抽象的&#34;请求的详细数据&#34;。
关于如何举起活动的主题,https://msdn.microsoft.com/en-us/library/edzehd2t(v=vs.110).aspx有一个相当标准的举动事件举例。 (转述如下)
class Counter
{
public event EventHandler DetailsButtonClicked;
protected virtual void OnDetailsButtonClicked(EventArgs e)
{
if (DetailsButtonClicked != null)
{
DetailsButtonClicked(this, e);
}
}
// provide remaining implementation for the class
}
在演示者中,订阅活动并执行操作,例如打开新视图。
有关提交活动时传递讯息的更多信息
您可以使用通用EventHandler在调用事件时传递消息。我只是鼓励你评估你提出的代码,以便于阅读和轻松重构。
例如,避免以编程方式发送字符串消息。而是发送枚举或常量值。
public void TryIt()
{
var z = new Counter();
z.DetailsButtonClicked += Z_DetailsButtonClicked;
z.OnDetailsButtonClicked("Greetings Earthlings");
}
private void Z_DetailsButtonClicked(object sender, CustomEventArgs e)
{
Debug.Print(e.Message);
}
public class CustomEventArgs : EventArgs
{
public CustomEventArgs(string message) { this.Message = message; }
public string Message { get; set; }
}
class Counter
{
public event EventHandler<CustomEventArgs> DetailsButtonClicked;
public virtual void OnDetailsButtonClicked(string message)
{
if (DetailsButtonClicked != null)
{
DetailsButtonClicked(this, new CustomEventArgs(message));
}
}
// provide remaining implementation for the class
}