2009-06-30 31 views
8

Tôi đã từng chơi với mẫu MVP bằng winforms trong vài ngày qua, chỉ có một điều mà tôi không biết phải làm thế nào. Làm thế nào để bạn tạo một biểu mẫu con từ chế độ xem khác. Đây có phải là một lựa chọn hợp lệ không.Đang tải các bản xem trước với MVP

public class MyForm : IMainFormView 
    { 
     private MainFormPresenter pres; 
     public MyForm() { pres = new MainFormPresenter(this); } 

     //Event from interface. 
     public event EventHandler<EventArgs> LoadSecondForm; 

     public void SomeButtonClick() 
     { 
      LoadSecondForm(this, EventArgs.Empty); 
     } 
    } 

    public class MainFormPresenter 
    { 
     private IMainFormView mView; 

     public MainFormPresenter(IMainFormView view) { 
      this.mView = view; 
      this.Initialize(); 
     } 

     private void Initialize() { 
      this.mView.LoadSecondForm += new EventHandler<EventArgs>(mView_LoadSecondForm); 
     } 


     private void mView_LoadSecondForm(object sender, EventArgs e) { 
      SecondForm newform = new SecondForm(); //Second form has its own Presenter. 
      newform.Load(); // Load the form and raise the events on its presenter. 
     } 
    } 

Tôi chủ yếu quan tâm đến cách bạn tải biểu mẫu con bằng cách sử dụng mẫu này và cách bạn chuyển một ID từ trang đầu tiên sang biểu mẫu con.

Cảm ơn.

Trả lời

2

Hãy xem this other SO question. Trong khi nó liên quan đến WPF và không WinForms, vấn đề có vẻ là như nhau.

Về cơ bản, tôi xem xét sự cần thiết phải hiển thị cửa sổ công ty con một Dịch vụ (bạn có thể gọi nó là WindowsService hoặc DialogService hoặc một cái gì đó tương tự). Điều đó giúp bạn đưa mọi thứ vào quan điểm, bởi vì ngay sau khi bạn nhận ra điều đó, Dependency Injection trở thành câu trả lời.

Trong câu trả lời, bạn mô hình hóa sự kiện này, nhưng tôi thích mô hình rõ ràng hơn nơi bạn gọi phương thức ShowDialog của DialogService. Tuy nhiên, cơ chế của mỗi cách tiếp cận không khác nhau.

1

Một vài ý kiến ​​về vấn đề này

đầu tiên này

private void mView_LoadSecondForm(object sender, EventArgs e) { 
     SecondForm newform = new SecondForm(); //Second form has its own Presenter. 
     newform.Load(); // Load the form and raise the events on its presenter. 
    } 

gì sẽ xảy ra nếu bạn quyết định thay ThirdForm cho SecondForm? Bạn cần phải tìm mọi cuộc gọi của newform = new SecondForm và thực hiện thay đổi.

Thay vào đó bạn nên quấn việc tạo ra các SecondForm trong một Object lệnh

public class CreateSecondForm : ICommand 
    { 

     public void Execute() { 
      SecondForm newform = new SecondForm(); //Second form has its own Presenter. 
      newform.Load(); // Load the form and raise the events on its presenter. 
     } 

    } 

Sau đó ở đây và bất kỳ nơi nào khác sẽ trả về hình thức thứ hai sử dụng cú pháp này

private void mView_LoadSecondForm(object sender, EventArgs e) { 
    CreateSecondForm createCmd = new CreateSecondForm(); 
    createCmd.Execute(); // Load the form and raise the events on its presenter. 
} 

Nếu bạn muốn subsitute một hình thức hoàn toàn mới cho SecondForm sau đó bạn chỉ có một nơi bạn cần phải đi. Nếu bạn muốn chuyển sang trạng thái hoặc giá trị thiết lập thì hãy sử dụng hàm tạo của lệnh. Bạn thậm chí có thể vượt qua trong một Presenter hoặc View và có lệnh kéo thông tin từ giao diện của nó.

Một điều khác tôi khuyên bạn nên đăng ký các biểu mẫu thực hiện quan điểm của bạn thay vì sử dụng lệnh mới. Điều này được thực hiện trong quá trình khởi tạo và sổ đăng ký bị treo trong lớp ứng dụng chính của bạn.

Ví dụ:

public class MySecondForm : ISecondFormView, IViewForm 
    { 
     //Stuff .... 
     Public ViewFormEnum ViewFormType { 
      return ViewFormEnum.SecondForm; 
     } 
     //Stuff .... 
    } 

nơi khác trong phần mềm

public void InitializeApp() { 
     //Stuff .... 
     MyApp.ViewForm.Add(new MySecondForm); 

     //Stuff .... 

} 

Sau đó lệnh được thiết lập như thế này.

public class CreateSecondForm : ICommand 
    { 
     myApp theApp; 
     public CreateSecondForm(myApp thisApp) { 
      theApp = thisApp; 
     } 

     public void Execute() { 
      SecondForm newform = theApp.Find(ViewFormEnum.SecondForm); 
      if (newForm != null) 
       newform.Load(); // Load the form and raise the events on its presenter. 
     } 

    } 

Xin lỗi, C# của tôi không phải là ngôn ngữ chính của tôi. Ưu điểm của phương pháp này là lắp ráp có chứa các hình thức có thể hoán đổi cho một hội đồng khác nhau với một bộ khác nhau của các hình thức. Điều này đặc biệt hữu ích cho việc tự động kiểm tra nơi các lớp mô phỏng có thể được thực hiện thay vì biểu mẫu. Bạn cũng có thể thiết lập nó để xử lý các khung nhìn null hữu ích cho việc phát hành một tập con của ứng dụng đầy đủ của bạn.

Mặc dù tôi thực sự khuyên bạn sử dụng lệnh này để bao gồm việc tạo Chế độ xem của bạn. Đề xuất thứ hai về việc đăng ký Chế độ xem có thể quá mức cần thiết tùy thuộc vào ứng dụng. Trong ứng dụng CAD/CAM của tôi, tôi có hàng tá hộp thoại và một số hình thức chính khác nhau được sử dụng cho các khía cạnh khác nhau của việc thiết lập và điều khiển bàn cắt kim loại 2D. Tuy nhiên trong một số ứng dụng khác của công ty tôi, tôi sử dụng một cách tiếp cận đơn giản vì chúng chủ yếu là các tiện ích đơn giản.

Các vấn đề liên quan