2011-10-02 74 views
5

我已經開始圍繞整個MVP模式進行包裝,儘管我對單個對象做的很好,但對於集合,它開始變得困難。MVP Passive View和監督控制器之間的實現差異

假設我們構建了一個簡單的WinForms應用程序,該應用程序由一個Form中的DataGrid組成,其中數據模型是一個簡單的東西集合,其中這些東西具有一堆屬性,View實際上將它們顯示:

型號

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; } 
} 

查看

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; } 
    } 
} 

演示

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; 
    } 
} 

所以,我應該查看的List<People> ListOfPeople吸氣實施,以及應該怎麼調用演示的UpdateView()

而且一般,這額外的演示方法將是有趣的,有爲了實現MVP 被動視圖分別監督控制器

任何意見,代碼風格的審查或意見將真誠讚賞。非常感謝。

回答

6

首先,你應該決定一個模式:如果你想利用數據綁定

  • 監督控制器是適當的,如果自動化視圖測試工具可
  • 被動視圖表示如果您的視圖數據變得更加複雜,或者您必須依賴完整視圖的純單元測試
  • 如果您需要輕鬆訪問完整的視圖狀態並且您有代碼,則Presentation Model(也稱爲Model View ViewModel)第一代可用

我收集了all aspects as well as links to useful considerations and examples

無論哪種情況,您都應該定義一個PeopleModel並讓PeopleViewImplementation參考PeopleModel。這清楚地將模型從視圖中分離出來。

當涉及到收集,監督控制器可以依靠列表的數據綁定到DataGridView。見winForms + DataGridView binding to a List。只有被動視圖和表示模型需要額外的代碼將列表映射到視圖字段和演示模型。

其次,數據映射應該澄清:PeopleView應該顯示一個人員列表還是幾個人的列表? DataGridView可以顯示每行一個人或每行一個人。如果一個人每行顯示,人的治療可以通過以下方式之一來實現,例如:

  • 顯示所有一個人的人在一個頁面上,並添加新頁面元素不同之間進行導航人民
  • 顯示數據網格中一個人的所有人,併爲人們添加一個選擇小部件,例如與各國人民一棵樹在數據網格中不同民族的
  • 混合者,並添加一列來顯示每個人的人
2

我的建議是爲該集合提供一個ViewModel。視圖實現將負責創建新實例並更新舊實例,但它不會觸及任何實際模型。爲了檢索它們,只需遍歷行和創建新行。最後,演示者將迭代該集合並創建/更新模型的每個成員。 (我也建議使用IEnumerable <>並使用yield return,這樣集合只迭代一次)。爲了顯示數據,你也可以使用這個ViewModel(所以它將是一致的),或者只是使用實際的模型(以只讀的方式),如果它們由於某種原因不同(也許你顯示比你更多的信息可以編輯)。

希望它有幫助。

+1

是的,我目前正試圖與MVPVM被動視圖界面嘗試和鼓勵TDD ,但同時有一個ViewModel來處理DataGridViews。 – Heliac

相關問題