【发布时间】:2014-09-10 16:18:52
【问题描述】:
我一直在研究 MVP 模式,并设法创建了一些简单的 MVP 兼容应用程序。
我现在正在尝试将该模式应用到更复杂的应用程序中,但我对最好的方法有一些疑问。
我的应用程序只有一个 WinForm,有两个按钮用于加载两种不同类型的数据。我的视图界面如下所示:
interface IView_MainForm
{
// Load input
//
event EventHandler<InputLoadEventArgs> LoadInput_01;
event EventHandler<InputLoadEventArgs> LoadInput_02;
bool Input01_Loaded { get; set; }
bool Input02_Loaded { get; set; }
}
在我的演示者中通过构造函数注入引用了 IView:
public Presenter_MainForm(IView_MainForm view)
{
this.View = view;
this.View.LoadInput_01 += new EventHandler<InputLoadEventArgs>(OnLoadInput_01);
this.View.LoadInput_02 += new EventHandler<InputLoadEventArgs>(OnLoadInput_02);
}
到目前为止,一切都很好。当用户单击加载数据的两个按钮中的任何一个时,会引发 LoadInput_## 事件,Presenter 正在处理它,检查输入是否有错误并根据我的数据模型对其进行结构化。
我的下一步是在视图中显示处理后的数据。
我正在努力让我的 View 尽可能被动和“愚蠢”,假设它对 Presenter 一无所知(它不订阅它的事件,Presenter 通过调用 IView 方法将数据发送到 View) ,更不用说模型了。
如果视图不知道数据模型是什么样的,我应该如何填充像 TreeView 这样的控件?
另外,我是否正确地了解了整个 MVP 的内容,还是我遗漏了什么?
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
你的视图(Form)是否实现了
IView_MainForm? -
如果你的
view不知道data model是什么(我假设你的意思是Model),它应该如何将自己绑定到数据? -
@JohnSaunders,明白了,谢谢。 @huMptyduMpty,是的,我的观点(
MainForm)实现了IView_MainForm,这就是我现在能够在基本级别实现MVP模式的方式:Presenter在其构造函数中将IView_MainForm作为参数,通过调用接口中指定的方法(由MainForm实现)订阅其事件并显示结果。 -
@michaelmoore 这正是问题所在。据我了解,在 MVP(PV) 中,
View和Model彼此一无所知,因为它是Presenter处理用户事件并指示View如何显示数据。如果我的View已经知道我的数据是什么样的,那么首先MVP 的意义何在?然后我可以通过直接引用我的Model来简单地填充我的控件...我在这里遗漏了什么吗?
标签: c# winforms design-patterns mvp