Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用设计模式分离VisualStudioGUI应用程序中的视图_C#_Winforms_Design Patterns - Fatal编程技术网

C# 使用设计模式分离VisualStudioGUI应用程序中的视图

C# 使用设计模式分离VisualStudioGUI应用程序中的视图,c#,winforms,design-patterns,C#,Winforms,Design Patterns,我正在为我的公司开发一个小的文件复制程序,它越来越大,我开始关心代码设计(我知道,我从一开始就应该有…) 现在我的问题是,我希望我的表单类代码尽可能精简。根据我的研究,听起来我想实现它是为了保持视图与程序的其余部分解耦。在VS2010/C中有没有关于如何执行此操作的提示?还是有更好的方法来做我想做的事 我使用的是Visual Studio 2010、.Net 4.0、C#,它是一个Windows窗体应用程序 欢迎对教程、书籍或开源示例提出建议 编辑:我刚刚发现了MVP模式,这可能与我有关。但我仍

我正在为我的公司开发一个小的文件复制程序,它越来越大,我开始关心代码设计(我知道,我从一开始就应该有…)

现在我的问题是,我希望我的表单类代码尽可能精简。根据我的研究,听起来我想实现它是为了保持视图与程序的其余部分解耦。在VS2010/C中有没有关于如何执行此操作的提示?还是有更好的方法来做我想做的事

我使用的是Visual Studio 2010、.Net 4.0、C#,它是一个Windows窗体应用程序

欢迎对教程、书籍或开源示例提出建议


编辑:我刚刚发现了MVP模式,这可能与我有关。但我仍然很感谢您的意见。

在过去的项目中,我们通过在Windows窗体中应用修改后的(通常与WPF关联)来实现这一点。有很多样板代码,所以要准备好你的打字手指,但从长远来看,它会有很好的回报

显然,这是一个很长的过程,可能会让人难以承受。慢慢来,一次完成每一部分值得注意的是,在WPF中,下面的许多工作都是为您完成的。

首先,我们从三个名称空间开始:(对于额外的点,将每个名称空间放在单独的程序集中,但这不是必需的

  • CompanyName.ProjectName.Models-包含域对象(包括集合类)
  • CompanyName.ProjectName.ViewModels包含各种视图模型类(见下文)
  • CompanyName.ProjectName.Views-包含表单和用户控件
创建域类
  • 开始时尽可能简单,主要是带有getter和setter的属性
  • 对于每个类中感兴趣的每个公共属性,创建匹配的
    Changed
    events
    。例如,如果您有一个名为
    Name
    的属性,则创建一个名为
    NameChanged
    的事件。每次属性值更改时,都应从setter中引发该事件
  • 创建包含业务逻辑的公共方法,例如
    Delete()
    。如果出现错误,这些方法应引发异常。(在更高级的设计中,您可能希望有一个包含业务逻辑的控制器对象。)
创建ViewModel类 ViewModel类主要是一个设计师代码隐藏类“类固醇”,除了它不知道如何使用它的实际控件或布局,只是行为。通常每个模型类都有一个ViewModel,但您也可以制作一个ViewModel,例如显示
列表的
ClassroomView

  • 创建一个类,该类包含和
  • 为每个要可视化的域对象或一组要可视化的对象创建类。这些类应继承自
    ViewModel
  • 在视图模型类中创建用于显示的只读公共属性,该属性表示要在屏幕上显示的内容。例如,在
    PersonViewModel
    类中,如果要显示全名,请创建一个名为
    FullName
    的属性,getter可以在该属性中连接
    FirstName
    和关联的
    人员
    模型的
    LastName
    属性
  • 每个ViewModel类还应该具有一个与基础数据相关的属性
  • 创建其他用于显示的读/写公共属性,例如:
    • bool
      属性,如
      ishadofhousehouse
      ,用于绑定到复选框或单选按钮
    • Color
      属性,如用于绑定到各种控件的
      BackColor
      /
      ForeColor
      /等的
      HighlightColor
    • string
      允许通过绑定到文本框来编辑基础数据模型对象的属性
  • 构建ViewModel对象时,它应注册基础数据模型对象的所有事件,例如
    FirstNameChanged
    。在eventhandlers中,您应为视图模型中受影响的任何属性引发
    PropertyChanged
    事件。例如
    FirstNameChanged
    事件应为
    FullName
    引发
    PropertyChanged
  • Dispose
    方法中,您应该从数据模型事件中注销,以防止内存泄漏。
  • 创建表示用户操作和可执行命令的公共方法,如
    Delete()
    。这些方法应该从用户的角度编写,以便它们可以弹出对话框说“确定吗?”然后调用数据模型对象或某个其他控制器对象上的方法
创建视图 好的,现在简单的部分是:

  • 将ViewModel对象作为项目数据源添加到解决方案中
  • 通过在屏幕上布置所需的控件来创建窗体和用户控件。创建文本框、数据网格等。对于应绑定到ViewModel实例的每个属性,使用(数据绑定)属性绑定到项目数据源。创建数据绑定时,它将自动创建绑定源组件
  • 在主窗体中,创建数据模型的初始实例,从磁盘加载,等等
  • 必要时,创建ViewModel类的实例,并设置相应BindingSource的数据源属性。