【发布时间】:2013-07-16 21:03:18
【问题描述】:
我想实现 MVP 模式。我有一个包含一些文本框的用户控件,当我将它放入表单时,我从用户控件调用一个方法并填充文本框。但在 mvp 模式中,我不知道如何访问usercontrol1.fill()。你有可以帮助我的例子吗?
【问题讨论】:
-
@veronika.op:如果您还有其他问题,请不要编辑此条目,而是创建一个新条目。我回滚了你的最新更改。
我想实现 MVP 模式。我有一个包含一些文本框的用户控件,当我将它放入表单时,我从用户控件调用一个方法并填充文本框。但在 mvp 模式中,我不知道如何访问usercontrol1.fill()。你有可以帮助我的例子吗?
【问题讨论】:
这是该模式的示例实现。 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-方法传递视图模型或在视图上设置自定义属性。
【讨论】:
_view.Show(),这反过来又充满了你的控制权。
如果您的用户控件被放置在一个表单中,并且假设该表单是您项目中的一个视图,那么正是这个视图负责访问该用户控件。您不应直接从演示者访问用户控件的任何方法。事实上,演示者不应该知道这些方法甚至用户控件的存在。演示者只知道实现该视图的现有接口的视图的存在。
因此,您的视图(表单)将知道并调用此用户控件的方法。要从演示者传递值以填充放置在表单中的用户控件,由视图实现的接口应该使用 set 方法公开一个公共属性(如果您还打算阅读,还可以使用 get 方法)那些值)。
由于您的视图正在实现此接口,因此在此属性的set 方法的实现中,您可以调用用户控件的任何方法,因为用户控件包含在您的表单中并且您的表单知道存在用户控件及其方法。从那里访问它应该没有任何问题。
同样,如果您需要从用户控件中读取值,这应该在视图中完成,在此属性的get 实现上。 Presenter 只需使用接口中定义的get 方法读取属性,视图就会知道如何访问这些值并返回它们。
【讨论】: