C# 如何在MVP模式中将UserControl附加到表单?

C# 如何在MVP模式中将UserControl附加到表单?,c#,user-controls,mvp,passive-view,C#,User Controls,Mvp,Passive View,我正在尝试使用MVP模式创建一种主/细节UI。我有通常的嫌疑犯: interface IMainView{} class MainView: Form, IMainView{} interface IMainPresenter{} class MainPresenter{} // Numerous domain objects 我还有一个UserControl,它也是它自己的MVP triad的视图: interface ISubView{} class SubView: UserCont

我正在尝试使用MVP模式创建一种主/细节UI。我有通常的嫌疑犯:

interface IMainView{}
class MainView: Form, IMainView{}

interface IMainPresenter{}
class MainPresenter{}

// Numerous domain objects
我还有一个UserControl,它也是它自己的MVP triad的视图:

interface ISubView{}
class SubView: UserControl, ISubView{}

interface ISubPresenter{}
class SubPresenter{}
MainPresenter创建子Presenter的实例,子Presenter又创建子视图的实例。我的问题是这些视图不包含彼此的引用,甚至不知道彼此的存在。他们只知道自己的演示者,但我想将一个作为用户控件的视图附加到另一个作为表单的视图。这是否可能做到,并且仍然保持每个观点对彼此的无知

在此之前,所有视图都已将每个演示者所需的属性公开为系统类型,因此,如果列表框更改为组合框或组,演示者不会受到影响。如果可能的话,我想保持这种状态,但如果我没有其他选择,我愿意打破这种模式

我这样做的原因是MainView向用户提供了一组对象。每个对象可以是几个(50多个)不同类中的一个。所有这些都将实现一个公共接口,但用于操作每个对象的UI将因基础类而异


顺便说一句,这是一个以.NET 2.0为目标的Winforms应用程序(虽然它被编译为C#3.0)

我解决了这个问题,让子演示者将对其视图的引用传递给主演示者,然后主演示者将其传递给其视图,然后将其分配给一个空面板

subView
  |
  V
subPresenter
  |
  V
mainPresenter
  |
  V
mainView

它作为普通的旧对象传递,因此两个演示者都不需要包含对winforms命名空间的引用。mainView只是假设它是UserControl的继承者,并将其强制转换为UserControl。

演示者禁止创建视图!!!你打破了MVP的原则!我已经研究了无数的例子和model/view/的变体。我遇到的唯一一致的规则是在视图和模型/域之间保持一定程度的分离。如果说有任何关于创造顺序、生命周期和三合会主要参与者所有权的建议,发表过他们研究的人都回避了。