如何在WinForms MVP模式中实现用户控件?

6

我希望实现MVP模式。我有一个用户控件,其中包含一些文本框,当我将其放入表单中时,我会从用户控件中调用一个方法来填充文本框。但在MVP模式下,我不知道如何访问usercontrol1.fill()。您有任何示例可以帮助我吗?


@veronika.op:如果您有其他问题,请不要编辑此条目,而是创建一个新的。我已经将您最新的更改回退了。 - Florian Greinacher
2个回答

6

这是模式的一个示例实现。Presenter只知道接口有一个show方法。Presenter调用它,但只有表单(也称为View)实现了如何显示表单。

public interface IMyFormView {
    void Show();
}

public class MyForm : IMyFormView {

    public MyForm() {
        var presenter = new MyFormPresenter(this);
        presenter.Init();
    }

    public void Show() {
        usercontrol1.fill();
    }
}

public class MyFormPresenter
{
    private IMyView _view;
    public MyFormPresenter(IMyView view) {
        _view = view;
    }

    public void Init() {
        _view.Show();
    }
}

如果您需要将数据传递到视图中,那么可以通过Show方法传递一个视图模型或在视图上设置自定义属性。


谢谢,但我不明白如何访问我的用户控件的方法。我没有发送参数的问题。我的问题是如何编写myusercontrol.fill()(fill是我的方法名称)? - veronika.np
我已经相应地更改了代码片段。现在主持人调用 _view.Show(),然后填充您的控件。 - Dennis Traub

2
如果您的用户控件放置在一个窗体中,假设该窗体是项目中的一个视图,则这个视图有责任访问用户控件。您不应直接从Presenter访问用户控件的任何方法。实际上,Presenter 不应该知道这些方法或者甚至是用户控件的存在。Presenter 只知道实现了一个给定接口的视图的存在。
因此,您的视图(即窗体)将知道并调用此用户控件的方法。为了向用户控件传递值以填充在您的窗体中放置的用户控件,由您的视图实现的接口应公开一个带有 set 方法的公共属性(如果您还计划读取这些值,则需要一个 get 方法)。
由于您的视图正在实现此接口,在此属性的 set 方法的实现中,您可以调用用户控件的任何方法,因为用户控件包含在您的窗体中,而您的窗体知道用户控件及其方法的存在。您不应该在那里访问任何问题。
同样地,如果您需要从用户控件中读取值,则应在视图中完成,在此属性的 get 实现中。Presenter 只使用接口中定义的 get 方法读取属性,而视图将知道如何访问这些值并返回它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接