在 MVP 中,演示者可以直接访问用户控件而不是通过界面吗?
In MVP can the presenter access a user control directly instead via interface?
我在尝试显示用户对按钮点击的控制时遇到了问题,就像从菜单中一样,同时仍然遵循 MVP 设计模式。我需要做的就是在单击按钮时将用户控件置于最前面,但应该在哪里处理呢?我正在考虑让用户控件在单击按钮时调用 "this.BringToFront()",但我相信这会破坏被动视图。我还在下面使用事件尝试了这个:
ItipManager 接口的视图
public partial class Form1 : Form, ITipManager
{
public event EventHandler homeButtonClicked;
public event EventHandler addTipButtonClicked;
public event EventHandler transactionButtonClicked;
public event EventHandler analysisButtonClicked;
public Form1()
{
InitializeComponent();
}
private void AddButton_Click(object sender, EventArgs e)
{
EventHandler handler = addTipButtonClicked;
handler?.Invoke(this, e);
}
TipManagerPresenter,它唯一的工作就是处理按钮点击
class TipManagerPresenter
{
private ITipManager tipManagerView;
private AddTip addTipControl;
private Home homeControl;
public TipManagerPresenter(ITipManager tipManagerView, AddTip addTipControl, Home homeControl)
{
this.tipManagerView = tipManagerView;
this.addTipControl = addTipControl;
this.homeControl = homeControl;
tipManagerView.addTipButtonClicked += new EventHandler(OnAddTipButtonClicked);
tipManagerView.homeButtonClicked += new EventHandler(OnHomeButtonClicked);
}
public void OnAddTipButtonClicked(object sender, EventArgs e)
{
addTipControl.BringToFront();
}
public void OnHomeButtonClicked(object sender, EventArgs e)
{
homeControl.BringToFront();
}
}
我相信上面的代码也打破了 MVP 模式,因为我让演示者直接访问用户控件而不是通过界面。这些方法中的任何一种都可以,还是有更好的解决方案?
这两种方法
public void OnAddTipButtonClicked(object sender, EventArgs e)
{
addTipControl.BringToFront();
}
public void OnHomeButtonClicked(object sender, EventArgs e)
{
homeControl.BringToFront();
}
没有使用它们拥有的参数,此外,如果您要在视图中更新不需要ui在 Presenter
层内制作任何 action/logic 的内容, 就在你的视野里做吧。
例如,如果您需要将视图中的任何内容置于最前面,您可以直接在此处进行。
如果您需要处理演示者的结果以便将 ui 元素置于最前面,最好在演示者内部处理它。
我在尝试显示用户对按钮点击的控制时遇到了问题,就像从菜单中一样,同时仍然遵循 MVP 设计模式。我需要做的就是在单击按钮时将用户控件置于最前面,但应该在哪里处理呢?我正在考虑让用户控件在单击按钮时调用 "this.BringToFront()",但我相信这会破坏被动视图。我还在下面使用事件尝试了这个:
ItipManager 接口的视图
public partial class Form1 : Form, ITipManager
{
public event EventHandler homeButtonClicked;
public event EventHandler addTipButtonClicked;
public event EventHandler transactionButtonClicked;
public event EventHandler analysisButtonClicked;
public Form1()
{
InitializeComponent();
}
private void AddButton_Click(object sender, EventArgs e)
{
EventHandler handler = addTipButtonClicked;
handler?.Invoke(this, e);
}
TipManagerPresenter,它唯一的工作就是处理按钮点击
class TipManagerPresenter
{
private ITipManager tipManagerView;
private AddTip addTipControl;
private Home homeControl;
public TipManagerPresenter(ITipManager tipManagerView, AddTip addTipControl, Home homeControl)
{
this.tipManagerView = tipManagerView;
this.addTipControl = addTipControl;
this.homeControl = homeControl;
tipManagerView.addTipButtonClicked += new EventHandler(OnAddTipButtonClicked);
tipManagerView.homeButtonClicked += new EventHandler(OnHomeButtonClicked);
}
public void OnAddTipButtonClicked(object sender, EventArgs e)
{
addTipControl.BringToFront();
}
public void OnHomeButtonClicked(object sender, EventArgs e)
{
homeControl.BringToFront();
}
}
我相信上面的代码也打破了 MVP 模式,因为我让演示者直接访问用户控件而不是通过界面。这些方法中的任何一种都可以,还是有更好的解决方案?
这两种方法
public void OnAddTipButtonClicked(object sender, EventArgs e)
{
addTipControl.BringToFront();
}
public void OnHomeButtonClicked(object sender, EventArgs e)
{
homeControl.BringToFront();
}
没有使用它们拥有的参数,此外,如果您要在视图中更新不需要ui在 Presenter
层内制作任何 action/logic 的内容, 就在你的视野里做吧。
例如,如果您需要将视图中的任何内容置于最前面,您可以直接在此处进行。
如果您需要处理演示者的结果以便将 ui 元素置于最前面,最好在演示者内部处理它。