在 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 元素置于最前面,最好在演示者内部处理它。