c# - 使用设计模式在Visual Studio GUI应用程序中分离 View

标签 c# winforms design-patterns

我正在为我的公司开发一个小的文件复制程序,它的大小已经足够大,可以开始关心代码设计了(我知道,我应该从一开始就拥有它)。

现在,我的问题是我希望我的表单类代码尽可能精简。根据我的研究,听起来我想实现Duplicate Observed Data以便将View与程序的其余部分分离。在VS2010 / C#中,有关如何执行此操作的任何提示?还是有更好的方法来做我想做的事?

我正在使用Visual Studio 2010,.Net 4.0,C#,它是Windows窗体应用程序。

欢迎提供有关教程,书籍或开放源代码示例的建议。

编辑:我刚刚找到有关MVP模式的this article,这可能与我有关。但是我还是会很感激的。

最佳答案

在过去的项目中,我们已经通过在Windows窗体中应用MVVM pattern的修改版本(通常与WPF关联)来解决此问题。有很多样板代码,因此请准备好打字的手指,但从长远来看,这样做的效果很好。

显然,这是很长的时间,可能会让人不知所措。花点时间并一次实现每个部分。值得注意的是,在WPF中,以下许多工作已为您完成。

首先,我们从三个名称空间开始:(为了加分,将每个名称空间放在单独的程序集中,但这不是必需的。


CompanyName.ProjectName.Models-包含您的域对象(包括集合类)。
CompanyName.ProjectName.ViewModels-包含各种视图模型类(请参见下文)
CompanyName.ProjectName.Views-包含您的表单和UserControls


创建域类


尽可能简单地开始,主要只是带有getter和setter的属性。
对于每个类中每个感兴趣的公共属性,创建匹配的Changed事件。例如,如果您有一个名为NameChanged的属性,则创建一个名为Name的事件。每当属性值更改时,都应从setter内引发该事件。
创建包含业务逻辑的公共方法,例如Delete()。如果出现错误,这些方法应引发异常。 (在更高级的设计中,您可能希望有一个包含业务逻辑的控制器对象。)


创建ViewModel类

ViewModel类主要是“类固醇”上的设计人员代码隐藏类,除了它不了解实际控件或如何使用它的布局,只知道行为。通常每个Model类都有一个ViewModel,但是您也可以制作一个显示ClassroomView的ViewModel,例如List<Student>


创建一个public, abstract ViewModelBaseimplements IDisposableINotifyPropertyChanged类。
为要可视化的每个域对象或要可视化的对象组创建类。这些类应从ViewModel继承。
创建只读公共属性以在视图模型类中显示,该属性表示要在屏幕上显示的内容。例如,在PersonViewModel类中,如果要显示全名,请创建一个名为FullName的属性,在该属性中,吸气剂可以将关联的FirstName模型的LastNamePerson属性连接在一起。
每个ViewModel类还应该具有一个与基础数据模型对象相关的属性。
创建其他读取/写入公共属性以进行显示,例如:


bool属性(例如IsHeadOfHouseHousehold)用于绑定到复选框或单选按钮。
Color属性(例如HighlightColor)用于绑定到各种控件的BackColor / ForeColor / etc。
string属性,这些属性允许通过绑定到文本框来编辑基础数据模型对象。

构造ViewModel对象时,它应注册基础数据模型对象的所有事件,例如FirstNameChanged。在事件处理程序中,应该为视图模型中受影响的所有属性引发PropertyChanged事件。例如对于FirstNameChanged事件的处理程序应提高PropertyChangedFullName
Dispose方法中,应该从数据模型事件中注销,以防止内存泄漏。
创建表示用户操作和他们可以执行的命令的公共方法,例如Delete()。这些方法应从用户角度编写,以便它们可以出现对话框以显示“您确定吗?”。然后,他们应该在数据模型对象或某些其他控制器对象上调用方法。


创建视图

好的,现在最简单的部分:


在解决方案中将ViewModel对象添加为项目数据源。
通过布置您想要在屏幕上的控件来创建表单和用户控件。创建TextBoxes,DataGrids等。对于应绑定到ViewModel实例的每个属性,请使用(DataBindings)属性绑定到您的项目数据源。创建数据绑定时,它将自动创建BindingSource组件。
在主窗体中,创建数据模型的初始实例,从磁盘加载等。
必要时,创建ViewModel类的实例,并设置适当的BindingSource的DataSource属性。该界面将自动生效。
对于按钮,编写Click事件处理程序以在ViewModel上调用适当的公共方法。


最终结果


您可以轻松修改数据模型对象。更改数据模型不会影响用户界面。
您可以轻松修改视图模型对象。如果要更改程序的行为,则不必更改数据模型,也不必更改控件布局。如果多个表单或用户控件使用同一视图模型,则程序中不同视图之间具有一致性。
您可以轻松修改表单和用户控件。如果要更改外观,则不必担心修改程序的行为或数据模型。每种形式的代码都很少。

关于c# - 使用设计模式在Visual Studio GUI应用程序中分离 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8944898/

相关文章:

c# - 使用回调而不是抛出异常?

c# - 如何让程序自动以管理员身份运行

c# - 如何在 C# 中编译正则表达式

c# - 使用现有控件向窗体添加选项卡控件

c# - Windows 窗体 - Tab 键在子面板中不起作用

c++ - 具有相同方法的静态和非静态版本是不是糟糕的设计

java - 如何实现Guava缓存来存储和获取不同类型的对象?

c# - 使用 tagLib sharp 库添加自定义标签

c# - 向 MemoryStream 写入和读取数据

c# - C# 中从 MemoryStream 反序列化抛出 OutOfMemory 异常