Winforms MVP показывает дочернюю форму mdi

Ребята, у меня проблема с шаблоном проектирования MVP, потому что я не уверен, как я могу показать дочернее представление в родительской форме. В моем представлении нет свойства MdiParent. Могу ли я вручную создать его в интерфейсе просмотра?

Очень некрасиво выглядят, каждая форма открывается в новом окне!

У меня есть два докладчика:

  1. MainPresenter (представляет логику mainForm (родительский))
  2. TaskPresenter (представляет логику для сохранения, вставки, удаления логики)

Два интерфейса представления:

  1. IMainView
  2. ITaskView

И две winforms:

  1. MainForm - главное окно (родительская форма mdi)
  2. форма задачи

Проверить код:

Главный презентатор

public class MainPresenter
{
    private readonly IMainView view;

    private List<ITaskModel> tasks;

    // Constructor
    public MainPresenter(IMainView view)
    {
        this.view = view;
        this.Init();
        this.tasks = new List<ITaskModel>();
    }

    // Initialize
    private void Init()
    {
        this.view.AddTask += AddTask;
    }

    // Add task
    private void AddTask(object sender, EventArgs e)
    {
        // Show as MDI CHILD 
    }
}

IMainView

  public interface IMainView 
  {
        event EventHandler<EventArgs> AddTask;
  }

TaskPresenter

public class TaskPresenter 
{
    private readonly ITaskView view;
    private List<ITaskModel> tasks;

    private bool isNew = true;
    private int currentIndex = 0;

    // Constructor
    public TaskPresenter(ITaskView view)
    {
        this.view = view;
        this.Initialize();
    }

    // Initialize
    public void Initialize()
    {
        tasks = new List<ITaskModel>();

        view.SaveTask += Save;
        view.NewTask += New;
        view.PrevTask += Previous;
        view.NextTask += Next;
    }

    private void Save(object sender, EventArgs e)
    {
    }
    private void New(object sender, EventArgs e)
    {
    }     
    private void Next(object sender, EventArgs e)
    {
    }
    private void Previous(object sender, EventArgs e)
    {
    }
    private void BlankTask()
    {   
    }
    private void LoadTask(ITaskModel task)
    { 
    }
}

ITaskView

public interface ITaskView
{
    String TaskName { get; set; }
    String TaskPriority { get; set; }
    DateTime? StartDate { get; set; }
    DateTime? DuoDate { get; set; }

    event EventHandler<EventArgs> SaveTask;
    event EventHandler<EventArgs> NewTask;
    event EventHandler<EventArgs> NextTask;
    event EventHandler<EventArgs> PrevTask;
}

А вот и MainForm

public partial class MainForm : Form, IMainView
{
    MainPresenter Presenter;

    // Construcor
    public MainForm()
    {
        InitializeComponent();
    }

    // Events
    public event EventHandler<EventArgs> AddTask;

    // On load
    private void MainForm_Load(object sender, EventArgs e)
    {
        Presenter = new MainPresenter(this);
    }

    // On click add task btn
    private void addTaskBtn_Click(object sender, EventArgs e)
    {
        if(AddTask != null)
        {
            // When is this event triggered i want to show another child form for adding new task
            AddTask(this, EventArgs.Empty); 
        }
    }
}

Итак, как я могу показать TaskView дочерним в MainView? введите здесь описание изображения


person Ivan    schedule 18.07.2016    source источник


Ответы (1)


UIApplication — это приложение Windows Forms, но выходной тип библиотеки классов. Добавить ссылку MVPFramework

ГлавнаяФорма

public partial class MainForm : Form , IMainView
{
    [Resolve]
    public IMainControl mainControl;

    public MainForm()
    {
        InitializeComponent();
    }


    public bool ShowAsDialog()
    {
        throw new NotImplementedException();
    }

    private void openChildFormToolStripMenuItem_Click(object sender, EventArgs e)
    {
        mainControl.OnOpenChildForm();
    }
}

Детская форма

public partial class ChildForm : Form , IChildView
    {
        public ChildForm()
        {
            InitializeComponent();
        }

        public bool ShowAsDialog()
        {
            throw new NotImplementedException();
        }


        public object MDIparent
        {
            set
            {
                this.MdiParent = (Form)value;
            }
        }
    }

CoreApplication — это библиотека классов

IMainControl

 public interface  IMainControl :IControl
  {
      void OnOpenChildForm();
  }

ГлавноеКонтроль

public class MainControl  :IMainControl
    {
        [Resolve]
      public IApplicationController applicationController;
      public void OnOpenChildForm()
      {
       IChildControl TransfersOnTheWayControl = applicationController.Resolve<IChildControl>();
       TransfersOnTheWayControl.Run();
      }
    }

ICChildControl

 public interface IChildControl :IControl
      {
         void Run();
      }

IMainView

public interface  IMainView :IView
{

}

IChildView

открытый интерфейс IChildView :IView {

      bool ShowAsDialog();`enter code here`

      object MDIparent { set; }
  }

IMainPresenter

public interface  IMainPresenter :IPresenter
 {

 }

IChildPresenter

public interface  IChildPresenter :IPresenter
 {
   bool Ask();
 }

ГлавнаяВедущий

public class MainPresenter :BasePresenter<IMainView>, IMainPresenter
 {

 }

РебенокВедущий

public class ChildPresenter : BasePresenter<IChildView>, IChildPresenter
    {

       public bool Ask()
       {
            this.Init();
            bool res = View.ShowAsDialog();
            ApplicationController.ClearInstance<IChildView>();
            return res;
       }

        public override void Init()
        {
            View.MDIparent = ApplicationController.GetMainFrom<IMainPresenter>();
            base.Init();
        }
    }

LauncherApplication — это консольное приложение, но тип вывода — Windows Form.

 class Program
        {
            static void Main(string[] args)
            {
                IApplicationController applicationController = new ApplicationController(new ServicesContainerAdapter());

                applicationController


                    //RegisterView
                    .RegisterView<IMainView, MainForm>()
                    .RegisterView<IChildView, ChildForm>()


                    //RegisterPresenter
                    .RegisterPresenter<IMainPresenter, MainPresenter>()
                    .RegisterPresenter<IChildPresenter, ChildPresenter>()


                    //RegisterController
                    .RegisterController<IMainControl, MainControl>()
                    .RegisterController<IChildControl, ChildControl>();



                IMainPresenter mainPresenter = applicationController.Resolve<IMainPresenter>();
                mainPresenter.Init();

                Application.Run((Form)mainPresenter.FormObject);
            }
       }
person Mahmud Büşra Yahyayev    schedule 25.05.2017
comment
можете выложить исходный код BasePresenter и IPresenter, IView? Также на какой MVPFramework вы ссылаетесь? - person Tom De Bie; 12.03.2020