我知道这个问题已经有将近 2 年的历史了,但我发现自己的情况非常相似。像你一样,我已经在互联网上搜索了 DAYS 并没有找到适合我需要的具体示例 - 我搜索得越多,我就一遍又一遍地回到相同的网站,直到我有大约 10 页紫色Google 中的链接!
无论如何,我想知道您是否曾经提出过令人满意的解决方案?根据上周阅读的内容,我将概述到目前为止我的工作方式:
我的目标是:
被动表单,演示者优先(演示者实例化表单,因此表单不知道它的演示者)
通过在表单(视图)中引发事件来调用演示者中的方法
应用程序有一个 FormMain,其中包含 2 个用户控件:
ControlsView(有 3 个按钮)
DocumentView(第 3 方图像缩略图查看器)
“主窗体”包含一个工具栏,用于保存常用文件等内容,仅此而已。
“ControlsView”用户控件允许用户单击“扫描文档”
它还包含一个树视图控件,用于显示文档和页面的层次结构
“DocumentView”显示扫描文档的缩略图
我真的觉得每个控件都应该有自己的 MVP 三元组以及主窗体,但我希望它们都引用相同的模型。我只是不知道如何协调控件之间的通信。
例如,当用户单击“扫描”时,ControlsPresenter 负责从扫描仪获取图像,我希望它在扫描仪返回的每个页面时将页面添加到树视图 - 没问题 - 但我也希望缩略图同时出现在 DocumentsView 中(问题是演示者彼此不了解)。
我的解决方案是让 ControlsPresenter 调用模型中的方法将新页面添加到业务对象中,然后在模型中引发“PageAdded”事件。
然后我让 ControlsPresenter 和 DocumentPresenter “侦听”此事件,以便 ControlsPesenter 告诉它的视图将新页面添加到树视图中,而 DocumentPresenter 告诉它的视图添加新缩略图。
总结一下:
控件视图 - 引发事件“ScanButtonClicked”
Controls Presenter - 监听事件,调用 Scanner 类到 AcquireImages 如下:
GDPictureScanning scanner = new GDPictureScanning();
IEnumerable<Page> pages = scanner.AquireImages();
foreach (Page page in pages)
{
m_DocumentModel.AddPage(page);
//The view gets notified of new pages via events raised by the model
//The events are subscribed to by the various presenters so they can
//update views accordingly
}
扫描每一页时,扫描循环调用“yield return new Page(PageID)”。
上述方法调用 m_DocumentModel.AddPage(page)。
新页面被添加到模型中,这会引发一个事件。
控制演示者和文档演示者都“听到”事件并相应地添加项目。
我不确定的一点是所有演示者的初始化 - 我在 Program.cs 中执行此操作,如下所示:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
IDocumotiveCaptureView view = new DocumotiveCaptureView();
IDocumentModel model = new DocumentModel();
IDocumotiveCapturePresenter Presenter = new DocumotiveCapturePresenter(view, model);
IControlsPresenter ControlsPresenter = new ControlsPresenter(view.ControlsView, model);
IDocumentPresenter DocumentPresenter = new DocumentPresenter(view.DocumentView, model);
Application.Run((Form)view);
}
不确定这是好、坏还是无关紧要!
无论如何,关于一个两年前的问题的帖子真是太棒了——尽管得到一些反馈是件好事......