代码之家  ›  专栏  ›  技术社区  ›  Amitd

为TabControl实现MVC/MVP设计。。设计问题

  •  1
  • Amitd  · 技术社区  · 16 年前

    我有一个Winform应用程序,有两个表单。 在一个表单中,我有一个带有3个选项卡和导航按钮的选项卡控件,可以在选项卡之间切换。

    在第一个选项卡上,用户选择一个文件,在导航到下一个选项卡时,我想做一些操作 对第一个选项卡中选择的文件进行处理,并在第三个选项卡中显示结果。

    另一个表单只是调用这个表单(启动应用程序)

    如何使用MVC/MVP实现这一点?

    目前我已经创建了嵌套表单。 启动应用程序窗体将创建选项卡窗体的实例,并在选定的索引上更改 选项卡控件,并匹配我正在开始申请表中处理的所选选项卡属性。在选项卡窗体上关闭时,在 开始申请表。(这并不理想)。

    编辑 :此外,每个选项卡都包含一个用户控件,我必须在更改选项卡时初始化该控件(参考上一个选项卡中选择的数据)

    简单的例子 正在选择一个。在第一个选项卡中压缩文件,单击下一步 将显示zip文件中的文件列表,并在第三个选项卡中使用进行处理 在第二个选项卡中选择的文件。(有更好的方法可以做到这一点……只是为了举例。)

    编辑2 :基本上,我对如何通过控制器从第一个选项卡获取值、进行处理并将其传递到下一个选项卡(通过控制器)以及在第二个选项卡(通过控制器)上设置用户控件属性感到困惑。此外,选项卡标题也将被删除。。 please see …所以标签表单看起来更像一个向导表单。这就是我使用SelectedIndexChanged属性的原因。

    基本上,我需要将视图和处理逻辑与Winform分开。

    谢谢大家。

    2 回复  |  直到 9 年前
        1
  •  1
  •   Hans Passant    16 年前

    用户界面的奇怪选择。总之,没有任何理由等待SelectedIndexChanged来处理文件。您不妨在选择文件后立即执行此操作。它将更好地工作,选项卡控件将变得更灵敏。如果等待事件发生,那么控件将被冻结一段时间,因为UI线程正忙于迭代事件。压缩文件。用户不会认为这是可取的。

    无论MVC的实现看起来是什么样子,它都会使MVC实现简单得多。额外的好处是,你现在不再依赖TabControl,可以使用任何最适合工作的控件。

        2
  •  1
  •   Peter Kelly    16 年前

    在这种情况下,模型将处理zip文件,例如 Print() , Extract() 等等,比如 PrintCompleted ExtractCompleted

    你的IView将公开一些方法和事件,这些方法和事件将抽象你与界面后面的UI的交互。所以也许有些方法,比如 DisplayFolderContents() 以及类似的事件 FileSelected()

    您的演示者将连接到模型和IView事件,并控制对每个事件调用哪些方法等。您使用TabControl的表单只是IView界面的一个实现。只需将IView的一个实现注入演示者,包括一个用于测试的模拟IView,就可以获得不同的视图。

    可以通过您使用的EventArg在MVP模式中传递值。

    /// <summary>
    /// The event args for a selected file.
    /// </summary>
    public class FileSelectedEventArgs : EventArgs 
    {
        public string FileName { get; private set; }
    
        public FileSelectedEventArgs(string fileName)
        {
            this.FileName = fileName;
        }
    }
    

    当用户选择一个文件时 FileSelected 事件在视图中引发,文件名在 FileSelectedEventArgs 。演示者侦听此事件,并调用模型上的方法-可能是 ExtractFile(string fileName) ,从视图的文件SelectedEventArgs中传入文件名。

    然后,演讲者会聆听 提取完成 事件,并在视图上调用适当的方法,从模型中传入参数。视图中的方法可以在TabControl或其他方式中显示数据。

    无论如何,这只是一种方法。