2011-10-02 21 views
5

Tôi đã bắt đầu quấn quanh toàn bộ mô hình MVP và mặc dù tôi đang làm việc tốt với các đối tượng đơn lẻ. Vì vậy, giả sử chúng ta đang xây dựng một ứng dụng WinForms đơn giản bao gồm một DataGrid trong một Form, với Mô hình dữ liệu là một bộ sưu tập các công cụ đơn giản, nơi mà các công cụ này có một loạt các thuộc tính và View sẽ thực sự hiển thị chúng:Sự khác nhau thực hiện giữa MVP Passive View và giám sát điều khiển cho các bộ sưu tập

mẫu

public class Person 
{ 
    public string Name { get; set; } 
    public DateTime Birth { get; set; } 
    public bool IsCool { get; set; } 
} 

public class People 
{ 
    public List<Person> Persons { get; set; } 
} 

Xem

public interface IPeopleView 
{ 
    List<People> ListOfPeople { get; set; } 
} 

public partial class PeopleViewImpl : Form, IPeopleView 
{ 
    private DataGridView _grid = new DataGridView(); 

    public PeopleViewImpl() 
    { 
     InitializeComponent(); 
    } 

    // Implementation of IPeopleView 
    public List<People> ListOfPeople 
    { 
     get { return /* TODO */; } 
     set { _grid.DataSource = value; } 
    } 
} 

Presenter

public class PeoplePresenter 
{ 
    private People _model; 
    private IPeopleView _view; 

    public PeoplePresenter(People model, IPeopleView view) 
    { 
     _model = model; 
     _view = view; 
    } 

    void UpdateView() 
    { 
     _view.ListOfPeople = _model.Peoples; 
    } 
} 

Vì vậy, những gì tôi nên thực hiện tại Xem lý lịch thành List<People> ListOfPeople getter cũng như làm thế nào tôi nên gọi người trình bày UpdateView()?

Và nói chung, trong đó phương pháp trình bày thêm sẽ là thú vị để có để đạt được MVP Passive XemGiám sát điều khiển tương ứng?

Bất kỳ lời khuyên, đánh giá hoặc đánh giá kiểu mã nào sẽ được đánh giá cao. Cảm ơn nhiều trước.

Trả lời

6

Trước hết, bạn nên quyết định cho một mẫu:

  • Giám sát điều khiển phù hợp nếu bạn muốn tận dụng dữ liệu ràng buộc và nếu một công cụ để kiểm tra xem tự động có sẵn
  • Passive View được chỉ ra nếu dữ liệu xem của bạn trở nên phức tạp hơn hoặc nếu bạn phải dựa vào các thử nghiệm đơn vị thuần túy để xem toàn bộ
  • Mô hình trình bày (còn được gọi là Chế độ xem mô hình ViewModel) là lý tưởng nếu bạn cần dễ dàng truy cập trạng thái xem hoàn chỉnh và nếu bạn có mã thế hệ có sẵn

Tôi đã thu thập all aspects as well as links to useful considerations and examples.

Trong cả hai trường hợp, bạn nên xác định PeopleModel và để PeopleViewImplementation tham chiếu PeopleModel.Điều này rõ ràng tách mô hình khỏi khung nhìn.

Khi nói đến bộ sưu tập, Bộ điều khiển giám sát có thể dựa vào liên kết dữ liệu của danh sách với DataGridView. Xem winForms + DataGridView binding to a List. Chỉ mô hình trình chiếu và xem thụ động yêu cầu mã bổ sung để ánh xạ danh sách tới các trường xem tương ứng với Mô hình trình bày.

Thứ hai, ánh xạ dữ liệu phải được làm rõ: Nên PeopleView hiển thị danh sách người hoặc danh sách một số người? DataGridView có thể hiển thị một người trên mỗi hàng hoặc một người trên mỗi hàng. Nếu một người được hiển thị trên mỗi hàng, việc điều trị của mọi người có thể đạt được theo một trong các cách sau, ví dụ:

  • Hiển thị tất cả mọi người của một người trên một trang và thêm phần tử máy nhắn tin để điều hướng giữa các các dân tộc
  • Hiển thị tất cả mọi người của một người trong lưới dữ liệu và thêm tiện ích lựa chọn cho mọi người, ví dụ: một cây với mọi dân tộc
  • Mix người của các dân tộc khác nhau trong lưới dữ liệu và thêm một cột để hiển thị những người của mỗi người
2

Đề xuất của tôi là có một ViewModel cho bộ sưu tập đó. Việc triển khai chế độ xem sẽ có trách nhiệm tạo các phiên bản mới và cập nhật cũ, nhưng nó sẽ không chạm vào bất kỳ thứ gì trong mô hình thực tế của bạn. Để lấy chúng, chỉ cần lặp lại các hàng tạo mới. Cuối cùng, người trình bày sẽ lặp lại bộ sưu tập đó và tạo/cập nhật từng thành viên của mô hình của bạn. (Tôi cũng đề nghị sử dụng IEnumerable <> và sử dụng lợi tức lợi nhuận để thu thập được lặp lại chỉ một lần).

Để hiển thị dữ liệu, bạn cũng có thể sử dụng ViewModel này (vì vậy nó sẽ nhất quán) hoặc chỉ sử dụng mô hình thực tế (theo kiểu chỉ đọc) nếu chúng khác nhau vì lý do nào đó (có thể yo hiển thị nhiều thông tin hơn bạn có thể chỉnh sửa).

Hy vọng điều đó sẽ hữu ích.

+1

Vâng, tôi đang cố gắng MVPVM với Passive Xem giao diện để thử và khuyến khích TDD , nhưng đồng thời có một ViewModel để xử lý DataGridViews. – Heliac

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