2015-09-23 18 views
0

這是我第一次嘗試使MVP與WinForms一起工作。我有一個更大的項目。但是,在這裏我對WinForms MVP示例進行了非常簡單的嘗試。我只有一個模型,一個表單和兩個視圖。 Presenter在Program.cs中進行了連接。一切工作。但是,對於一個特定的用戶控件,我似乎無法將其餘業務邏輯重構爲Presenter。我正在嘗試製作一個很容易作爲演示項目進行修改的示例。我真的不是在尋找簡單的工作,而是在尋找「canon」的答案,如果有這樣的事情。任何幫助或建議,你可以提供世界不勝感激。即使是向正確的方向推進也是一個很大的幫助。如何從用戶控件(視圖)去除演示者的邏輯

我MainFormPresenter:

internal class MainFormPresenter 
{ 
    private readonly SimpleContext _context = new SimpleContext(); 
    private readonly IMainFormView _mainFormView; 
    private readonly IPeopleListView _peopleListView; 
    private readonly IPersonInfoView _personInfoView; 

    public MainFormPresenter(IMainFormView mainFormView) 
    { 
     _peopleListView = mainFormView.PeopleListView; 
     _personInfoView = mainFormView.PersonInfoView; 

     _mainFormView = mainFormView; 
     mainFormView.Load += MainFormViewOnLoad; 
     mainFormView.FormClosed += MainFormViewOnFormClosed; 

     _peopleListView.SelectionChanged += OnSelectedNameChanged; 
    } 

    private void OnSelectedNameChanged(object sender, EventArgs e) 
    { 
     int id = _peopleListView.GetSelectedId(); 
     Person person = _context.People.Find(id); 

     _personInfoView.SetFirstName(person.FirstName); 
     _personInfoView.SetLastName(person.LastName); 
     _personInfoView.SetBirthDate(person.BirthDate); 
    } 

    private void MainFormViewOnFormClosed(object sender, FormClosedEventArgs e) 
    { 
     _context.Dispose(); 
    } 

    private void MainFormViewOnLoad(object sender, EventArgs e) 
    { 
     _context.People.Load(); 

     BindingList<Person> people = _context.People.Local.ToBindingList(); 

     _peopleListView.SetDataSource(people); 
    } 
} 

我的代碼隱藏我PeopleListView:

public partial class PeopleListView : UserControl, IPeopleListView 
{ 
    private readonly BindingSource _bSource; 

    public PeopleListView() 
    { 
     _bSource = new BindingSource(); 
     InitializeComponent(); 
    } 

    public int GetSelectedId() 
    { 
     DataGridViewRow row = PeopleGridView.CurrentRow; 

     if (row != null) 
     { 
      Person person = (Person)row.DataBoundItem; 
      return person.PersonId; 
     } 

     return 0; 
    } 

    public void SetDataSource(BindingList<Person> people) 
    { 
     _bSource.DataSource = people; 
     _bSource.RaiseListChangedEvents = true; 

     PeopleGridView.AutoGenerateColumns = false; 
     PeopleGridView.DataSource = _bSource; 
    } 

    private void PeopleGridView_SelectionChanged(object sender, EventArgs e) 
    { 
     SelectionChanged?.Invoke(new object(), new EventArgs()); 
    } 

    public event EventHandler SelectionChanged; 
} 

現在我該怎樣提取此邏輯回演示? MVP模式(根據Pluralsight的Windows窗體最佳實踐)聲明視圖不應該關心它正在顯示的數據。例如關注點分離。但是我希望我的視圖在模型更改時進行更新。

回答

0

它可能不是佳能,但這是我如何處理它。建設性的批評仍然非常受歡迎。 「平原OL」只是叫我一個粗心大意的白癡,或者告訴我我做了什麼或沒有做得正確的事情,也是如此。

我的改性主講人:

internal class MainFormPresenter 
{ 
    private readonly SimpleContext _context = new SimpleContext(); 
    private readonly IMainFormView _mainFormView; 
    private readonly IPeopleListView _peopleListView; 
    private readonly IPersonInfoView _personInfoView; 

    public MainFormPresenter(IMainFormView mainFormView) 
    { 
     _peopleListView = mainFormView.PeopleListView; 
     _personInfoView = mainFormView.PersonInfoView; 

     _mainFormView = mainFormView; 
     _mainFormView.Load += MainFormViewOnLoad; 
     _mainFormView.FormClosed += MainFormViewOnFormClosed; 

     _peopleListView.SelectionChanged += OnSelectedNameChanged; 
    } 

    private void OnSelectedNameChanged(object sender, EventArgs e) 
    { 
     DataGridViewRow row = _peopleListView.GetSelectedRow(); 
     Person person = (Person) row.DataBoundItem; 

     _personInfoView.SetFirstName(person.FirstName); 
     _personInfoView.SetLastName(person.LastName); 
     _personInfoView.SetBirthDate(person.BirthDate); 
    } 

    private void MainFormViewOnFormClosed(object sender, FormClosedEventArgs e) 
    { 
     _context.Dispose(); 
    } 

    private void MainFormViewOnLoad(object sender, EventArgs e) 
    { 
     _context.People.Load(); 

     BindingList<Person> people = _context.People.Local.ToBindingList(); 

     BindingSource bSource = new BindingSource 
     { 
      DataSource = people, 
      RaiseListChangedEvents = true 
     }; 

     _peopleListView.SetDataSource(bSource); 
    } 
} 

我的修改的用戶控制(查看):

public partial class PeopleListView : UserControl, IPeopleListView 
{ 
    public PeopleListView() 
    { 
     InitializeComponent(); 
    } 

    public DataGridViewRow GetSelectedRow() 
    { 
     return PeopleGridView.CurrentRow; 
    } 

    public void SetDataSource(BindingSource bSource) 
    { 
     PeopleGridView.AutoGenerateColumns = false; 
     PeopleGridView.DataSource = bSource; 
    } 

    private void PeopleGridView_SelectionChanged(object sender, EventArgs e) 
    { 
     SelectionChanged?.Invoke(new object(), new EventArgs()); 
    } 

    public event EventHandler SelectionChanged; 
}