我已经开始围绕整个 MVP 模式,尽管我对单个对象做得很好,但在集合方面却开始变得困难。
所以假设我们正在构建一个简单的WinForms应用程序,它由一个Form中的DataGrid组成,数据Model是一个简单的东西集合,其中这些东西有很多属性,而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;
}
}
那么我应该在View的List<People> ListOfPeople
getter中实现什么,以及我应该如何调用Presenter的UpdateView()
?
通常,为了分别实现MVP 被动视图和监督控制器,哪些额外的Presenter方法会很有趣?
任何建议,代码风格评论或意见将得到真诚的感谢。非常感谢。
答案 0 :(得分:6)
首先,您应该决定使用一种模式:
我收集了all aspects as well as links to useful considerations and examples。
在任何一种情况下,您都应该定义PeopleModel
并让PeopleViewImplementation
引用PeopleModel
。这清楚地将模型与视图区分开来。
在集合方面,监督控制器可以依赖列表与DataGridView
的数据绑定。见winForms + DataGridView binding to a List。只有被动视图和演示模型需要额外的代码才能将列表分别映射到视图字段到演示模型。
其次,应澄清数据映射:PeopleView
是否应显示人员名单或若干人民名单? DataGridView
可以每行显示一个人,也可以每行显示一个人。如果每行显示一个人,可以通过以下方式之一来实现对人的待遇,例如:
答案 1 :(得分:2)
我的建议是为该集合设置一个ViewModel。视图实现将负责创建新实例并更新旧实例,但它不会触及实际模型的任何内容。为了检索它们,只需迭代行创建新的。最后,演示者将迭代该集合并创建/更新模型的每个成员。 (我还建议使用IEnumerable&lt;&gt;并使用yield return,因此集合只迭代一次)。
为了显示数据,您还可以使用此ViewModel(因此它将保持一致)或仅使用实际模型(以只读方式),如果由于某种原因它们不同(可能您显示的信息比您可以显示的更多)编辑)。
希望它有所帮助。