c# - 模型 View 展示器,如何在 View 之间传递实体?

标签 c# winforms mvp

编辑:接受 Chris Holmes 的回应,但如果有人想出更好的方法,随时准备重构!谢谢!

用 MVP 做一些 winforms 什么是将实体传递给另一个 View 的最佳方式。

假设我有一个 CustomerSearchView/Presenter,在双击时我想显示 CustomerEditView/Presenter。我不想让我的 View 了解模型,所以我无法创建一个在参数中采用 ICustomer 的 ctor。

我的 react 是,

CustomerSearchView 创建一个新的 CustomerEditView,它创建自己的展示器。 然后我的 CustomerSearchView 会做类似的事情:

var customerEditView = new CustomerEditView();
customerEditView.Presenter.Customer = this.Presenter.SelectedCustomer;

其他可能的方法是一个 CustomerDTO 类,并制作一个 CustomerEditView 接受其中一个 CustomerDTO,但我认为它有很多工作简单。

很抱歉提出基本问题,但我能找到的所有示例都无法达到这一点,而且这是一个棕地项目,到目前为止使用的方法让我头疼...

最佳答案

我不知道你是如何表达你的观点的,所以在这里给你具体的建议有点困难。这就是我以前做这种事情的方式:

我们所做的是让 CustomerSearchViewPresenter 触发类似 OpenCustomer(customerId) 的事件。 (假设您的搜索 View 只有几条客户数据,而 customerId 就是其中之一。如果您的搜索 View 列出了整个客户对象,那么您可以调用 OpenCustomer(customer)。但我不会构建一个搜索 View 并允许它填充整个对象......我们在数据方面保持我们的搜索 View 轻量级。)

应用程序中的其他地方是一个事件处理程序,它监听 OpenCustomer() 事件并执行创建带有 Presenter 的新 CustomerEditView 的任务(我将推迟到我的 IoC 容器为我做这些事情,所以我不必在任何地方使用“new”关键字)。创建 View 后,我们可以将 id(或客户对象)传递给新的 CustomerEditView,然后显示它。

这个负责列出 OpenCustomer() 事件并执行 CustomerEditView 创建的类通常是我们应用程序中的某种 Controller 类。

为了进一步简化这种情况,我采用了另一种方式:我在应用程序或模块启动时创建了 CustomerSearchView(& presenter)和 CustomerEditView(& presenter)。当 CustomerSearchView 需要打开一个 Customer 进行编辑时,CustomerEditView 成为 OpenCustomer 事件的响应者并将数据加载到自身中,并且知道如何在它应该做的任何容器中显示自己。

所以有多种方法可以做到这一点。

关于c# - 模型 View 展示器,如何在 View 之间传递实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/534054/

相关文章:

design-patterns - 关于 MVP 和 MVVM 的一些混淆

java - 将数据存储在数据库还是文件中?

c# - 请求有关类设计、继承/聚合的建议

c# - Tablet WPF Windows 桌面应用程序 - 滚动问题

c# - 反序列化json对象xamarin android c#

winforms - 如何编辑外部 web.config 文件?

vb.net - 使用 Visual Studio Designer 时,如何将 WinForms 控件的类型更改为从原始类型派生的新类型?

c# - 每次尝试单击时如何更改按钮的颜色?

c# - 如何加载列表框中的所有项目而不仅仅是视觉项目

Android MVP 和抽屉导航