這是我第一次嘗試使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窗體最佳實踐)聲明視圖不應該關心它正在顯示的數據。例如關注點分離。但是我希望我的視圖在模型更改時進行更新。