Pregunta

Estoy tratando de crear una especie de IU maestra / detalle usando un patrón MVP. Tengo los sospechosos habituales:

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

interface IMainPresenter{}
class MainPresenter{}

// Numerous domain objects

También tengo un UserControl que también es una vista de su propia tríada de MVP:

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

interface ISubPresenter{}
class SubPresenter{}

El MainPresenter crea una instancia del SubPresenter, que a su vez, crea una instancia de SubView. Mi problema es que las vistas no contienen referencias entre sí, ni siquiera saben que existen. Solo conocen sus propios presentadores, pero quiero adjuntar una vista que sea un UserControl a otra vista que sea un formulario. ¿Es posible hacer esto y aún mantener la ignorancia de cada punto de vista?

Hasta este punto, todas las vistas han expuesto las propiedades que necesita cada presentador como tipos de sistema, por lo que los presentadores no se verían afectados si un ListBox cambiara a ComboBox o RadioGroup. Me gustaría mantenerlo de esta manera si es posible, pero estoy dispuesto a romper este patrón si no tengo otra opción.

Mis razones para hacer esto es que MainView presenta al usuario una colección de objetos. Cada objeto puede ser una de varias (más de 50) clases diferentes. Todos implementarán una interfaz común, pero la IU para manipular cada objeto variará según la clase subyacente.

Por cierto, esta es una aplicación de Winforms dirigida a .NET 2.0 (aunque está compilada como C # 3.0)

¿Fue útil?

Solución

Resolví esto haciendo que el subpresentador pase una referencia a su vista al presentador principal, que luego la pasa a su vista, que luego la asigna a un panel vacío.

subView
  |
  V
subPresenter
  |
  V
mainPresenter
  |
  V
mainView

Se pasa como un objeto antiguo simple, por lo que ninguno de los presentadores debe incluir referencias al espacio de nombres de winforms. El mainView simplemente asume que es un difunto de UserControl y lo emite como tal.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top