我正在为我的公司开发一个小的文件复制程序,它的大小已经足够大,可以开始关心代码设计了(我知道,我应该从一开始就拥有它)。
现在,我的问题是我希望我的表单类代码尽可能精简。根据我的研究,听起来我想实现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 ViewModelBase
和implements IDisposable
的INotifyPropertyChanged
类。
为要可视化的每个域对象或要可视化的对象组创建类。这些类应从ViewModel
继承。
创建只读公共属性以在视图模型类中显示,该属性表示要在屏幕上显示的内容。例如,在PersonViewModel
类中,如果要显示全名,请创建一个名为FullName
的属性,在该属性中,吸气剂可以将关联的FirstName
模型的LastName
和Person
属性连接在一起。
每个ViewModel类还应该具有一个与基础数据模型对象相关的属性。
创建其他读取/写入公共属性以进行显示,例如:bool
属性(例如IsHeadOfHouseHousehold
)用于绑定到复选框或单选按钮。Color
属性(例如HighlightColor
)用于绑定到各种控件的BackColor
/ ForeColor
/ etc。string
属性,这些属性允许通过绑定到文本框来编辑基础数据模型对象。
构造ViewModel对象时,它应注册基础数据模型对象的所有事件,例如FirstNameChanged
。在事件处理程序中,应该为视图模型中受影响的所有属性引发PropertyChanged
事件。例如对于FirstNameChanged
事件的处理程序应提高PropertyChanged
为FullName
。
在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/