5

我已经开始思考整个MVP模式,尽管我在单个对象方面做得很好,但在集合方面开始变得困难。

因此,假设我们正在构建一个简单的 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;
    }
}

那么我应该在 View 的List<People> ListOfPeoplegetter 上实现什么以及我应该如何调用 Presenter 的UpdateView()呢?

通常,为了分别实现 MVP Passive ViewSupervising Controller ,有哪些额外的 Presenter 方法会很有趣?

任何建议、代码风格审查或意见将不胜感激。提前非常感谢。

4

2 回答 2

7

首先,您应该决定一种模式:

  • 如果您想利用数据绑定并且可以使用用于自动视图测试的工具,则监督控制器是合适的
  • 如果您的视图数据变得更复杂,或者您必须依赖纯单元测试来获得完整视图,则会指示被动视图
  • 如果您需要轻松访问完整的视图状态并且可以生成代码,则演示模型(也称为模型视图 ViewModel)是理想的选择

我收集了所有方面以及有用的注意事项和示例的链接

无论哪种情况,您都应该定义 aPeopleModel和 let PeopleViewImplementationreference PeopleModel。这清楚地将模型与视图分开。

当涉及到集合时,监督控制器可以依赖列表的数据绑定到DataGridView. 请参阅winForms + DataGridView 绑定到 List。只有被动视图和表示模型需要额外的代码来将列表分别映射到视图字段到表示模型。

其次,数据映射要明确:应该PeopleView显示一个人的列表还是几个人的列表?DataGridView可以每行显示一个人,也可以每行显示一个人。如果每行显示一个人,则可以通过以下方式之一实现对人的处理,例如:

  • 在一个页面上显示一个人的所有人,并添加一个寻呼机元素以在不同的人之间导航
  • 在数据网格中显示一个人的所有人,并为这些人添加一个选择小部件,例如一棵包含所有人的树
  • 在数据网格中混合不同人的人,并添加一列显示每个人的人
于 2012-01-18T19:35:55.353 回答
2

我的建议是为该集合创建一个 ViewModel。视图实现将负责创建新实例并更新旧实例,但它不会触及您实际模型的任何内容。为了检索它们,只需迭代行并创建新的。最后,演示者将迭代该集合并创建/更新模型的每个成员。(我还建议使用 IEnumerable<> 并使用 yield return 以便集合只迭代一次)。

为了显示数据,您还可以使用此 ViewModel(因此它将保持一致)或仅使用实际模型(以只读方式),如果它们由于某种原因不同(可能显示的信息比您可以编辑的更多)。

希望能帮助到你。

于 2011-12-23T06:07:05.947 回答