我有一个包含2个表单的Winform应用程序。 在一种形式中,我有一个带有3个标签的选项卡控件和用于在标签之间切换的导航按钮。
在第一个标签上,用户选择一个文件,在导航到下一个标签时我想做一些 处理在第一个选项卡中选择的文件,并在第3个选项卡中显示结果。
另一种形式只是调用此表单(启动应用程序。)
我如何使用MVC / MVP做到这一点?
目前我已经创建了嵌套表单。 启动应用程序表单将创建选项卡表单的实例,并在SelectedIndexChanged上创建 选项卡控件和匹配选定的选项卡属性我正在启动应用程序表单中进行处理。并在选项卡表单上关闭设置结果在 开始申请表格(这不太理想)。
编辑:此外,每个标签都包含一个用户控件,我必须在标签更改时进行初始化(裁判到上一个标签中选择的数据。)
简单示例在第一个标签中选择.zip文件,然后点击下一步 将显示zip文件中的文件列表,并在第三个选项卡中进行处理 在第二个选项卡中选择的文件。(有更好的方法可以做同样的事情。例如,为了示例。)
编辑2 :基本上我很困惑如何通过控制器从第一个标签获取值,进行处理,并将其传递到下一个标签(通过控制器)并设置用户控件属性第二个选项卡(通过控制器)。也删除了选项卡标题.. please see ..所以选项卡表单看起来更像是一个向导表单。这就是我使用SelectedIndexChanged属性的原因。
基本上我需要从Winform中分离视图和处理逻辑。
全部谢谢。
答案 0 :(得分:1)
UI的奇怪选择。 Anyhoo,没有理由等待SelectedIndexChanged处理文件。您可以在选择文件后立即执行此操作。它会更好地工作,选项卡控件变得更具响应性。如果您等到事件,那么当您的UI线程忙于迭代.zip文件时,控件将被冻结一段时间。用户不会认为这是可取的。
使MVC实现更简单,无论它看起来如何。额外的好处是你现在不再依赖TabControl,并且可以使用任何最适合这项工作的控件。
答案 1 :(得分:1)
在这种情况下,您的模型将处理您的zip文件,例如Print()
,Extract()
等方法以及PrintCompleted
和ExtractCompleted
等事件。
您的IView将公开抽象您与界面后面的UI交互的方法和事件。因此,可能有一些方法,例如DisplayFolderContents()
和FileSelected()
等事件。
您的演示者将连接到Model和IView事件并控制在每个事件上调用哪些方法。您有TabControl的表单只是IView接口的实现。只需将一个IView实现注入Presenter,您就可以拥有不同的视图,包括用于测试的Mock IView。
可以通过您使用的EventArgs在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
中的文件名可用。 Presenter侦听此事件,并调用模型上的方法 - 可能是ExtractFile(string fileName)
,从View中传入FileSelectedEventArgs中的fileName。
Presenter然后侦听要从模型中触发的ExtractCompleted
事件(它还具有您想要的任何自定义事件标记),并在View上调用适当的方法,从模型中传入参数。 View中的方法可以在TabControl中以其他方式显示数据。
无论如何,这只是一种做法。