【问题标题】:Separating the view in Visual Studio GUI Applications using Design Patterns使用设计模式分离 Visual Studio GUI 应用程序中的视图
【发布时间】:2012-01-20 16:48:52
【问题描述】:

我正在为我的公司开发一个小文件复制程序,它变得足够大,以至于我开始关心代码设计(我知道,我应该从一开始就...)。

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

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

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

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

【问题讨论】:

    标签: c# winforms design-patterns


    【解决方案1】:

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

    显然,这很长,可能会让人不知所措。花点时间,一次实施每一件。 值得注意的是,在 WPF 中,下面的许多工作都是为您完成的。

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

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

    创建域类

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

    创建 ViewModel 类

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

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

    创建视图

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

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

    最终结果

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

    【讨论】:

    • 这太棒了。当我知道它的效果如何时,我会更新。谢谢!
    • 我还没有完成它的实现,但我现在把它称为一个解决方案,因为我已经深入研究了它。
    猜你喜欢
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多