【问题标题】:MVP Call a formMVP 调用表单
【发布时间】:2013-12-05 06:53:16
【问题描述】:

我尝试在 WinForms 应用程序中实现 ModelViewPresenter(MVP) 模式。我有一个带有按钮的主窗体,当我单击此按钮时,会显示一个新窗体。遵循 MVP 模式的最佳方法是什么?我想,我应该从我的演示者那里打开第二个表单,这样视图就不会知道其他视图的任何信息。但我不确定。我的应用程序只有三个对话框。最好的方法是什么?

代码

        private void LoadAndShowMasterTrackForm()
    {
        if (GvClaims.SelectedRowsCount < 1)
            return;

        // Create an empty list.
        var rowsToUpdate = new List<TrackData>();
        // Add the selected rows to the list.
        for (int i = 0; i < GvClaims.SelectedRowsCount; i++)
        {
            if (GvClaims.GetSelectedRows()[i] >= 0)
            {
                var track = GvClaims.GetRow(GvClaims.GetSelectedRows()[i]) as TrackData;
                if (track != null)
                    rowsToUpdate.Add(track);
            }
        }
        using (var uow = new UnitOfWork())
        {
            try
            {
                GvClaims.BeginUpdate();
                var frmSynonyms = new MasterTrackDialog { DataSourceMainGridView = rowsToUpdate, DataSource = rowsToUpdate, SessionUow = uow };
                var result = frmSynonyms.ShowDialog(this);
                if (result == DialogResult.Cancel)
                    uow.RollbackTransaction();
            }
            catch (Exception ex)
            {
                uow.RollbackTransaction();
                Logger.Error(ex.Message, ex);
            }
            finally
            {
                GcClaims.RefreshDataSource();
                GvClaims.EndUpdate();
            }
        }

    }

谢谢!

【问题讨论】:

  • 请显示一些代码。

标签: c# winforms mvp


【解决方案1】:

在 MVP 视图中“拥有”Presenter,而不是相反。 Presenter 是关于演示逻辑,而不是关于应该打开哪个视图以及如何打开。

因此,您不能(不应该)在演示者中实例化和打开视图。

这样看:Presenter 通常只有对 View 界面的引用,因此您可能有一个控制台视图和一个 winform 视图。因此,Presenter 不负责知道哪种类型的视图当前“在线”以及如何启动一个。

Presenter 可以做的是命令视图做某事。 例如,它可以调用view.ConfirmOperation(),现在取决于视图如何在 UI 中执行此操作。控制台视图可能会在命令行中提示,而 winforms 视图可能会打开一个对话框。

这里的重要部分是 Presenter 不会“思考”对话等方面,它“思考”的是业务逻辑(需要确认操作等)。

希望对你有帮助。

【讨论】:

  • 谢谢 Alexey,它有帮助。我认为,这是对 MVP 的一个很好的解释。这意味着,主视图调用另一种形式,不是吗?在 MVP 中也有一个 Mediator 或 NavigatorManager 来解决这个问题,不是吗?但是好的,我的应用程序拥有三个表单。仅仅为三个视图使用 NavigatorManager 可能太多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 2021-05-28
相关资源
最近更新 更多