我遇到了一个问题,那就是尝试在仍然遵循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模式,因为我使演示者可以直接访问用户控件而不是通过界面。这些方法之一是好的还是有更好的解决方案?
答案 0 :(得分:1)
这两种方法
public void OnAddTipButtonClicked(object sender, EventArgs e)
{
addTipControl.BringToFront();
}
public void OnHomeButtonClicked(object sender, EventArgs e)
{
homeControl.BringToFront();
}
也不使用它们具有的参数,如果您要在视图中更新不需要在Presenter
层内进行任何操作/逻辑的操作,只需在视图内进行操作即可。
例如,如果您需要先展示视图中的任何内容,则可以在那里进行。
如果需要处理演示者的结果以使该ui元素更显眼,那么在演示者内部处理它是一个好习惯。