Winforms Windows窗体的UI设计模式(如用于WPF的MVVM)

Winforms Windows窗体的UI设计模式(如用于WPF的MVVM),winforms,design-patterns,Winforms,Design Patterns,MVVM最常用于WPF,因为它非常适合WPF。但是Windows窗体呢?对于Windows窗体是否也有这样一种已确立且常用的方法/设计模式?一个能很好地与Windows窗体配合使用的工具?有没有一本书或一篇文章能很好地描述这一点?可能是MVP还是基于MVC?我已经尝试过MVP,它似乎也适用于windows窗体。 这本书有一个带有MVP模式的windows窗体示例(示例工资单应用程序)。这个应用程序并没有那么复杂,但会让您了解如何创建它 您可以在以下位置获得源代码: 编辑: MVP模式有两种变

MVVM最常用于WPF,因为它非常适合WPF。但是Windows窗体呢?对于Windows窗体是否也有这样一种已确立且常用的方法/设计模式?一个能很好地与Windows窗体配合使用的工具?有没有一本书或一篇文章能很好地描述这一点?可能是MVP还是基于MVC?

我已经尝试过MVP,它似乎也适用于windows窗体。 这本书有一个带有MVP模式的windows窗体示例(示例工资单应用程序)。这个应用程序并没有那么复杂,但会让您了解如何创建它

您可以在以下位置获得源代码:

编辑: MVP模式有两种变体 (a) 被动视图和(b)监控控制器

对于复杂的数据绑定场景,我更喜欢使用监督控制器模式。 在监控控制器模式中,数据绑定的责任在于视图。因此,对于treeview/datagrid,这应该在各自的视图中,只有视图不可知逻辑应该转移到演示者

我建议大家看看下面的MVP框架

不要直呼其名(这是一个MVP框架)

简单winforms MVP视频

处理下拉列表的一个示例

简单的treeview绑定示例(穷人的绑定)。您可以在BindTree()中添加任何特定于treeview的逻辑。 下面是代码片段。。。。未经测试,直接从思想中输入

public interface IYourView
{
   void BindTree(Model model);
}

public class YourView : System.Windows.Forms, IYourView
{
   private Presenter presenter;

   public YourView()
   {
      presenter = new YourPresenter(this);
   }

   public override OnLoad()
   {
         presenter.OnLoad();
   }

   public void BindTree(Model model)
   {
       // Binding logic goes here....
   }
}

public class YourPresenter
{
   private IYourView view;

   public YourPresenter(IYourView view)
   { 
       this.view = view;
   }

   public void OnLoad()
   {
       // Get data from service.... or whatever soruce
       Model model = service.GetData(...);
       view.BindTree(model);
   }
}
您可以将它们用作起点,尽管它们有点过时

在一般指导下有,这是对.NET方式和分层N层应用程序的一个很好的介绍

对于更正式的“模式”,有。
(来源:)

举几个例子


如前所述,在使用Winforms时,我总是以MVP模式工作。但您将使用的设计模式并不意味着您将正确使用。MVP上有大量反模式连接

如果您想以一种良好的方式启动一切,那么必须使用构建智能客户端的框架。因此,我建议使用这种设计和实践:智能客户端软件工厂

您在这里讨论了当前的智能客户端框架:

PS:我喜欢这篇关于MVP反模式的帖子:

希望这有帮助


BindTree方法似乎有点过时 对我来说是有缺陷的。突然,景色变了 知道这个模型。这是个好主意吗 事情一定有很多人 面对这种情况, 问题。我很惊讶那里 没有关于它的书。从那以后 是关于.NET中所有内容的书籍 世界

这些设计不是关于隐藏模型,而是精确地定义应用程序不同层之间的交互。您可以完全更改后端,只要通过Bindtree传递模型,您的UI就会继续工作

在Rajesh给出的示例中,类模型可能是一个糟糕的名称选择。它可以是TreeData或RecordsData。无论您如何定义它,它都具有使用Winforms的绑定机制将特定控件绑定到基础数据所需的功能

浏览此类资料的最佳网站是。Martin Fowler收集了各种有用的UI设计模式和企业设计模式

同样,关键是使用接口来精确定义每一层如何相互作用

在我自己的应用程序(用于运行金属切割机的CAD/CAM应用程序)中,我的结构如下所示

  • 实现表单接口的表单
  • 带有实现视图的视图的UIDLL 与表单交互的接口 通过表单界面。这个 特定的视图会自动注册 使用UIViewDLL视图执行找到的命令对象 在交互的命令库中 用这个模型
  • 命令库;名单 实现ICommand的命令。 与之交互的命令 视图通过接口执行此操作 在UIViewDLL中公开
  • UIViewDLL;公开视图接口 由命令使用
  • 模型;这些类和集合 构成my的核心数据结构 应用对我来说,这些都是东西 如材料、切割路径、形状、, 床单、手电筒等
  • 效用;一个常用的DLL 我公司使用的实用程序类 这跨越了不同的应用。对于 复杂数学函数示例

    • 我读到的关于UI设计模式的第一个好解释是在Jeremy Miller的博客-。它描述了常见的模式——被动视图、MVP等,并介绍了在C#中实现它们的一些方法。

      我相信MVP是一种非常适合WinForms开发的模式——微软WinForms框架中的使用部分证明了这一点

      我在WinForms中使用MVP从视图中提取代码,因为我无法测试视图代码。并且还可以使需要重用(或复制)的代码不在视图中,因为它不能被共享

      我可以参考我自己使用MVP模式的项目。虽然我肯定我用得并不完美

      您提到了为WPF工作的MVVM——我认为这是因为强大的数据绑定支持。如果您没有在WPF中使用数据绑定(这当然不是强制性的),那么您可以选择MVP。关键是MVP对于任何客户端应用程序都是一个很好的选择。如果您计划在非WPF的项目之间共享代码,甚至在WPF中,这可能是一个“更好”的选择

      有关在WinForms中使用MVP的价值的更多证据,请参阅Boodhoo关于使用MVP的视频演示:
      和同一作者在

      上的一篇MSDN文章,我写过一种称为MVP-VM的MVP/MVVM设计模式变体,它是为需要完全测试覆盖率并使用数据绑定作为主要机制的winforms应用程序量身定制的解决方案