Как мне прикрепить UserControl к форме в шаблоне MVP? - PullRequest
4 голосов
/ 29 июля 2009

Я пытаюсь создать своего рода интерфейс мастера / детализации, используя шаблон MVP. У меня есть обычные подозреваемые:

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

interface IMainPresenter{}
class MainPresenter{}

// Numerous domain objects

У меня также есть UserControl, который также является представлением своей собственной триады MVP:

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

interface ISubPresenter{}
class SubPresenter{}

MainPresenter создает и экземпляр SubPresenter, который, в свою очередь, создает экземпляр SubView. Моя проблема в том, что представления не содержат ссылок друг на друга и даже не знают, что существуют. Они знают только о своих собственных докладчиках, но я хочу прикрепить одно представление, которое является UserControl, к другому представлению, которое является формой. Возможно ли это сделать и при этом поддерживать невежество друг друга по отношению друг к другу?

До этого момента все представления выставляли свойства, необходимые каждому докладчику, в качестве системных типов, поэтому докладчики не будут затронуты, если ListBox изменится на ComboBox или RadioGroup. Я бы хотел оставить это так, если это возможно, но я готов нарушить эту модель, если у меня нет другого выбора.

Моими причинами для этого является то, что MainView представляет пользователю коллекцию объектов. Каждый объект может быть одним из нескольких (более 50) разных классов. Все будут реализовывать общий интерфейс, но пользовательский интерфейс для управления каждым объектом будет зависеть от базового класса.

Кстати, это приложение Winforms, предназначенное для .NET 2.0 (хотя оно скомпилировано как C # 3.0)

1 Ответ

2 голосов
/ 18 сентября 2009

Я решил эту проблему, передав субпредставителю ссылку на свой вид главному докладчику, который затем передает его своему виду, который затем назначает его пустой панели.

subView
  |
  V
subPresenter
  |
  V
mainPresenter
  |
  V
mainView

Он передается как обычный старый объект, поэтому ни одному из докладчиков не нужно включать ссылки на пространство имен winforms. MainView просто предполагает, что он является потомком UserControl, и выполняет приведение в таком виде.

...