在MVP中,演示者可以直接通过界面访问用户控件吗?

时间:2019-07-15 20:55:17

标签: c# winforms mvp

我遇到了一个问题,那就是尝试在仍然遵循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模式,因为我使演示者可以直接访问用户控件而不是通过界面。这些方法之一是好的还是有更好的解决方案?

1 个答案:

答案 0 :(得分:1)

这两种方法

  public void OnAddTipButtonClicked(object sender, EventArgs e)
        {
            addTipControl.BringToFront();
        }

        public void OnHomeButtonClicked(object sender, EventArgs e)
        {
            homeControl.BringToFront();
        }

也不使用它们具有的参数,如果您要在视图中更新不需要在Presenter层内进行任何操作/逻辑的操作,只需在视图内进行操作即可。

例如,如果您需要先展示视图中的任何内容,则可以在那里进行。

如果需要处理演示者的结果以使该ui元素更显眼,那么在演示者内部处理它是一个好习惯。