Winforms MVP具有多个视图和一个演示者

时间:2012-03-19 15:28:17

标签: c# winforms design-patterns mvp

我正在尝试按照模型视图展示器(MVP)模式在我的应用程序中开发项目管理系统。我的问题是,我看过很多 MVP 的例子,但我没有看到一个有一个Presenter和多个Views。例如,当用户打开项目时,可以通过树视图,数据网格和图表查看相同的项目数据。我该如何应对?

4 个答案:

答案 0 :(得分:3)

为了使代码解耦并易于维护,我建议你为每个View配备一个演示者,即使它们看起来非常相似:这样每个视图都有自己的表示逻辑。 如果您获得了需要在多个视图上显示的相同数据,您可以在演示者之间共享View模型,但我建议您为每个演示者使用不同的视图模型(即使它们非常相似)

答案 1 :(得分:2)

您采用的方式是将视图放在界面后面,然后将演示者与视图的具体实现连接起来。

那就是说,我不确定你是否会想要在现实世界中这样做。处理树形视图与图表之间的差异意味着您最终会在视图界面中对事物进行概括,并在视图中编写大量杂乱的代码以完成合同。

我建议让主持人以1:1的比例查看比率。如果您想要对同一数据进行多次查看,那么您应该在演示者之间共享您的模型,因此您将以不同的方式显示相同的数据。

答案 2 :(得分:1)

每个视图实例几乎总是有一个presenter实例。

假设您打开CustomerView及其CustomerViewPresenter。这是每个人的一个例子。

您打开另一个CustomerView和另一个CustomerViewPresenter实例。这是每个的两个实例。

这并不意味着给定的演示者总是必须使用相同的视图,实际上它不应该。演示者应该与一个视图界面交谈。您应该可以将实际视图交换为模拟视图以进行测试。

答案 3 :(得分:0)

<块引用>

这个问题可能很老了,但我只想发布我的答案以备将来使用。

如果你有一个可以在多个视图上使用的视图,继承是关键。

示例:

using System;

// declaring an interface
public interface A {

    // declare a treeview;
    void treeView();
    // declare a datagrid;
    void datagrid();
    // declare a chart;
    void chart();
}

// The views of interface A 
// is inherited into interface B
public interface B : A {
    // declare a label or string
    string mystring  { get; set; }
}

C# 允许用户将一个界面继承到另一个界面。当一个类实现继承的接口时,它必须提供在接口继承链中定义的所有成员的实现。

public partial class Form1 : Form, B
{
    private Presenter presenter;

    public Form1()
    {
        InitializeComponent();
    }

    public string mystring
    {
        get
        {
            return textBox1.Text;
        }
        set
        {
            textBox1.Text = value;
        }
    }

    public void treeView()
    {
        presenter = new Presenter(this);
        presenter.GenerateTreeView();
    }

    public void datagrid()
    {
        presenter = new Presenter(this);
        presenter.GenerateDatagrid();
    }

    public void chart()
    {
        presenter = new Presenter(this);
        presenter.GenerateChart();
    }
}

您的演示者可能看起来像这样:

public class Presenter
{
    public B viewB;
    public DomainLogic model;

    public Presenter(B view)
    {
        viewB = view;
    }

    public void GenerateTreeView()
    {
        model = new DomainLogic();
        model.CreateTreeView();
    }

    public void GenerateDatagrid()
    {
        model = new DomainLogic();
        model.CreateDatagrid();
    }

    public void GenerateChart()
    {
        model = new DomainLogic();
        model.CreateChart();
    }

    public void GenerateString()
    {
        model = new DomainLogic();
        viewB.mystring = model.createString();
    }

}

在这种情况下,您可能在一个演示者中有 2 个视图。不是字面上的 2 个视图。但是继承可以避免代码重复到您的视图中。