编辑:接受了chris holmes的回复,但如果有人想出更好的方法,随时准备重构!谢谢!
使用mvp做一些winforms什么是将实体传递到另一个视图的最佳方式。
假设我有一个CustomerSearchView/Presenter
,双击时我想显示CustomerEditView/Presenter
。我不想让我的视图知道这个模型,所以我不能创建一个参数ICustomer
的ctor。
我的反应是,CustomerSearchView
新建一个CustomerEditView
,创建自己的演示者。
然后我的CustomerSearchView
会做如下事情:
var customerEditView = new CustomerEditView();
customerEditView.Presenter.Customer = this.Presenter.SelectedCustomer;
另一种可能的方法是使用
CustomerDTO
类,并创建一个接受其中一个CustomerEditView
的CustomerDTO
,但我认为这是一项非常简单的工作。对于基本问题很抱歉,但所有的例子我都找不到,这是一个棕地项目,目前使用的方法是让我头痛…
最佳答案
我不知道你是如何表达你的观点的,所以在这里给你具体的建议有点困难。我以前就是这样做的:
我们所做的是让customersearchviewpresenter触发一个类似opencustomer(customerid)的事件。(这是假设您的搜索视图只有少量的客户数据,customerID就是其中之一)。如果您的搜索视图列出了整个客户对象,那么您可以调用opencustomer(customer)。但我不会建立一个搜索视图,并允许它填充整个对象…我们在数据方面保持搜索视图的轻量级。)
应用程序中的其他地方是一个事件处理程序,它监听opencustomer()事件并执行创建新的customereditview w/presenter的任务(我将遵从我的ioc容器为我做这些事情,所以我不必在任何地方使用“new”关键字)。创建视图后,我们可以将id(或customer对象)传递给新的customereditview,然后显示它。
负责列出opencustomer()事件并执行customereditview创建的类通常是我们应用程序中的某种控制器类。
为了进一步简化这种情况,我采用了另一种方法:在应用程序或模块启动时创建customersearchview(&presenter)和customereditview(&presenter)。当customersearchview需要打开一个客户进行编辑时,customereditview将成为open customer事件的响应者,并将数据加载到自身,并且知道如何在它应该执行的任何容器中显示自己。
所以有多种方法可以做到这一点。