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

bit*_*onk 152 design-patterns winforms

MVVM最常用于WPF,因为它非常适合它.但是Windows Forms怎么样?对于Windows Forms,是否存在已建立且常用的方法/设计模式?一个与Windows Forms明确协作的一个?有没有一本书或一篇文章能够很好地描述这一点?也许MVP或MVC基于?

raj*_*lai 91

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

C#中的敏捷原则,模式和实践 ......

您可以在源代码中获取 源代码

编辑:

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

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

我建议看看下面的MVP框架 MVC# - 一个MVP框架

不要去名字(这是一个MVP框架).

简单的winforms MVP视频 Winforms - MVP

处理下拉列表MVP - DropDownList的示例

简单的树视图绑定示例(穷人的绑定).您可以在BindTree()中添加任何特定于树视图的逻辑.

下面是代码片段....未经测试,直接从思想中键入....

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);
   }
}
Run Code Online (Sandbox Code Playgroud)


ale*_*exl 14

正如它已经说过的那样,我在使用Winforms时总是使用MVP模式.但是你使用的设计模式并不意味着你会使用正确的.MVP附有大量反模式.

如果您想以良好的方式启动所有内容,则必须使用该框架来构建智能客户端.因此,我将建议使用该设计和实践:智能客户端软件工厂 http://www.codeplex.com/smartclient

您在此处讨论了当前的智能客户端框架:http://codebetter.com/blogs/glenn.block/archive/2008/05/10/prism-cab-and-winforms-futures.aspx

PS:我喜欢关于MVP反模式的这篇文章:http://blog.mattwynne.net/2007/06/13/mvp-smells/

希望这可以帮助


jbe*_*jbe 9

模型-视图-视图模型(MVVM)模式是一种设计模式.根据定义,设计模式在面向对象的世界中显示了一个通用的解决方案,并且该解决方案可以应用于各种平台(WPF,WinForms,Java Swing等).我同意MVVM最适合与WPF一起使用,因为它利用了强大的绑定功能.但是,Windows窗体也支持数据绑定.

WAF Windows窗体适配器显示了如何在Windows窗体应用程序应用MVVM模式.

  • WAF适用于WPF,而不适用于Windows窗体。该链接具有误导性。 (2认同)
  • 该链接没有误导性.WAF Windows Forms Adapter附带一个MVVM应用程序,该应用程序实现了两次:1.WinForms; 2. WPF.两个应用程序共享较低层,这些层独立于UI技术. (2认同)

Avi*_*zra 5

我写过MVP/MVVM设计模式的一种变体,称为MVP-VM,它是winforms应用程序的量身定制的解决方案,需要完整的测试覆盖率并使用数据绑定作为保持演示文稿更新模型数据的主要机制.

用于.NET Winforms的MVVM

MVVM(模型视图视图模型)引入了类似的方法,用于在赋予数据绑定(WPF)的环境中将表示与数据分离.由于.NET framework 2.0已经提供了高级数据绑定基础结构,它还允许应用程序对象的设计时绑定 - "视图模型"实体可以很好地适应基于MVP的环境.


Tia*_*eal 5

我向我的两个技术同事问了同样的问题:MVVM for WindowsForms 可能吗?两者都给了我完全相同的答案:“不可能!WindowsForms 缺少 WPF 和 Silverlight 的丰富绑定(OneTime、OneWay、TwoWay、OnewayToSource),而且还缺少 TypeConverters。”

  • WindowsForms 的屏幕激活器模式 - 您可以在这里找到它,由 jagui 从 Caliburn.Micro 移植
  • 丰富的绑定和类型转换器 - Kent Boogaart 的Truss,以独立于 UI 的方式实现
  • 命令 - WPF 应用程序框架 (WAF)有一个 WafWinFormsAdapter 项目,负责处理一些 MVVM 内容,即命令

再说一遍,我们可以为 WinForms 提供 MVVM 吗?我们可以。我们拥有所有的碎片。我们只需要把它们粘在一起。