如何在使用C# WinForms的MVP模式中切换视图?

7

据我所知,当我们使用MVP时,我们将所有的展示逻辑移动到Presenter中。但我们不想让Presenter知道视图实现的细节,那么在应用程序中如何导航到另一个屏幕呢?你是如何管理应用程序流程的呢?

4个回答

4

使用一些导航器接口,例如:

interface INavigator
{
    void MoveTo (string screenName);
    void MoveTo (string screenName, NavigationParameters parameters);
}

每个演示者都将在构造函数中传递此导航器的一个实例。这样,导航既与推荐者分离,也与各个视图分离。
您可以在配置中定义屏幕名称和实际表单类之间的映射关系。

1

这是视图上的一个方法。例如,您可以有一个抽象方法,如ShowCustomerForm(),在WinForms中的实现将是CustomerForm.Show(或WinForms中的其他名称),而在WebForms中则是Response.Redirect(CustomerForm.aspx)。


在视图创建ICustomerForm接口实例之后,您可以使用类似以下方法的某些方法将Presenter传递给它:Init(CustomerFormPresenter)。 - dzendras

1

我假设您指的是另一个具有自己的MVP-pair的屏幕?

今天早上我正在考虑这种情况,我的解决方案可能是有一个Coordinator知道需要打开的Presenter和MVP-pair。该Coordinator打开新的presenter+view,并在完成后可选择调用第一个presenter的方法以获取结果。

这样,第一个MVP不必了解新屏幕的任何信息,他们只会发出事件。打开第二个窗口并进行通信的逻辑完全包含在Coordinator中。


0
我们使用Lennaert称之为协调器(我们称之为工作流控制器)来实现这一点。我来自Java Web开发领域,这个想法是应用程序控制器的一种形式。但我在这方面遇到了一些问题,因为workflowcontroller运行一个命令。每个命令都代表一个工作流或一系列相关步骤(因此命名为workflowcontroller)。flowcontroller处理命令之间的导航,而flowcontroller有一个导航器来导航步骤之间的转换。每个步骤都有一个完成事件(由presenter连接),以及NextStep方法,我们用它来导航到下一个步骤。我们的worflowcontroller与菜单紧密耦合,所以我们可以在不同的工作流之间导航。步骤建立了视图和Presenter之间的链接。我们没有任何配置,并且已经将建立下一个要执行的步骤的逻辑硬编码到一个名为NextStep的方法中。它正在生产中,但我对此并不满意。这里有太多细节需要深入了解。
我考虑切换到更加事件驱动的东西。我们使用消息总线来进行所有其他通信,我希望将其转移为在屏幕之间导航。我不知道这是否有帮助。我们的屏幕大多由顺序工作流组成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接