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


159

MVVM最适合WPF使用,因为它非常适合。但是Windows窗体呢?Windows窗体是否也有这样的既定且常用的方法/设计模式?一种可以与Windows Forms完美配合的软件吗?有没有一本书或一篇文章对此进行了很好的描述?也许基于MVP或MVC?



5
这似乎是一个好问题。看到票和星星..
nawfal 2012年

13
当这正是我正在寻找的对话时,这怎么不具有建设性?适度,不支配!
CAD

因此,基本上,适用于WinForms的MVVM是可能的。但是大多数人宁愿谈论他们过去如何使用MVP / MVC,而不是推动Winforms / MVVM的发展。或者,他们宁愿研究它如何真正称为Presenter Model而不是MVVM,以及MVVM对WPF的吸引力。
H. Abraham Chavez 2013年

9
当我把这种问题归结为“不是建设性的”时,我总是感到失望,因为正如已经提到的另一幅海报,这种讨论正是我来这里寻求的。主持人,请采取更为宽松的态度​​,并简化“非建设性”按钮。
蒂姆·隆

Answers:


94

我尝试过MVP,它似乎也可以与Windows窗体配合使用。本书有一个带有MVP模式的Windows窗体示例(薪资示例应用程序)。该应用程序不是那么复杂,但是会为您提供有关如何创建它的想法。

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

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

编辑:

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

对于复杂的数据绑定方案,我更喜欢使用Supervising控制器模式。在监督控制器模式中,数据绑定责任在于视图。因此,对于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);
   }
}

1
谢谢,那本书中的例子对我来说有点太简单了。在Winforms和MVP中,如何使用更复杂的数据显示(例如TreeView或DataGridView),如何将逻辑存储在什么位置?
bitbonk

bitbonk-我已经更新了答案,并将检查是否可以获得更多信息。
rajesh pillai 09年

1
BindTree方法对我来说似乎有点缺陷。突然,视图就知道了模型。那是件好事儿吗?必须有大量的人民面临这类问题。我很惊讶没有关于它的书。由于存在有关.NET世界中所有内容的书籍。
bitbonk

1
那不是缺陷。这是MVP模式的“ Supervisory Controller”风格。在Supervisor Controller中,视图可以识别模型(这是一个表示模型)。另一个是“被动视图”,其中视图与模型完全分离。
rajesh pillai 09年

14

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

如果要以良好的方式启动所有内容,则必须使用该框架来构建智能客户端。因此,我建议使用该设计和做法:Smart Client Software Factory 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/

希望这可以帮助


9

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

WAF Windows窗体适配器说明了如何应用MVVM模式在Windows窗体应用程序。


3
WAF适用于WPF,而不适用于Windows窗体。该链接具有误导性。
宾利·戴维斯

2
链接没有误导。WAF Windows Forms Adapter随附了MVVM应用程序,该应用程序实现了两次:1. WinForms;2. WPF。两个应用程序共享下层,这些下层独立于UI技术。
jbe 2012年

5

我写了有关称为MVP-VM的MVP / MVVM设计模式的变体,这是针对Winforms应用程序的量身定制的解决方案,这些应用程序需要完整的测试范围并使用数据绑定作为使演示文稿保持模型数据更新的主要机制。

NET Winforms的MVVM

MVVM(模型视图视图模型)引入了类似的方法,用于在允许数据绑定(WPF)的环境中将表示形式与数据分离。由于.NET Framework 2.0已经提供了高级数据绑定基础结构,该基础结构还允许设计时绑定应用程序对象-“视图模型”实体非常适合基于MVP的环境。


4

我向两个技术人员问了同样的问题:MVVM for WindowsForms是否可能?两者都给了我完全相同的答案:“ 没办法!WindowsForms缺少WPF和Silverlight的丰富绑定(OneTime,OneWay,TwoWay,OnewayToSource),并且也缺少TypeConverters。”

  • WindowsForms的屏幕激活器模式-您可以在此处找到它,由jagui从Caliburn.Micro移植
  • 丰富的绑定和TypeConverters- Kent Boogaart撰写的Truss,以UI独立的方式完成
  • 命令-WPF 应用程序框架(WAF)有一个WafWinFormsAdapter项目,该项目负责处理某些MVVM,即命令

同样,我们可以为WinForms使用MVVM吗?我们可以。我们拥有所有的碎片。我们只需要将它们粘合在一起。


4

我认为MVP是一种非常适合WinForms开发的模式-部分证明是它在Microsoft WinForms框架CAB中的使用。

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

我可以参考我自己的项目,在其中使用MVP模式ExceptionReporter.NET。虽然我确定我不会完美地使用它。

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

有关在WinForms中使用MVP的价值的更多证据,请参阅Boodhoo关于使用MVP的视频演示:http : //www.bestechvideos.com/2008/06/29/dnrtv-show-14-jean-paul-boodhoo-on-model -view-presenter 和同一作者在http://msdn.microsoft.com/zh-cn/magazine/cc188690.aspx上发表的MSDN文章


Boodhoo的内容似乎与WebForms有关,而不与WinForms有关。除非视频后面还有其他内容...?
罗杰·利普斯科姆

3

BindTree方法对我来说似乎有点缺陷。突然,视图就知道了模型。那是件好事儿吗?必须有大量的人民面临这类问题。我很惊讶没有关于它的书。由于存在有关.NET世界中所有内容的书籍。

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

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

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

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

在我自己的应用程序(用于运行金属切割机的CAD / CAM应用程序)中,我的结构看起来像这样。

  • 实现表单接口的表单
  • 具有实现视图接口的视图的UIDLL,该视图接口通过表单接口与表单进行交互。特定的视图向UIViewDLL注册,视图执行与模型交互的命令库中的命令对象。
  • 命令库;实现ICommand的命令列表。与视图交互的命令通过UIViewDLL中公开的接口进行交互。
  • UIViewDLL; 公开命令使用的视图界面。
  • 模型; 构成我的应用程序核心数据结构的类和集合。对我来说,这些是材料,切割路径,形状,薄片,割炬等。
  • 效用; 一个DLL,它具有我公司跨不同应用程序使用的常用实用程序类。例如复杂的数学函数。

3

您可以使用企业体系结构,模式和实践作为起点,尽管它们过时了。

在一般指导下,有.NET的应用程序体系结构:设计应用程序和服务,这是对.NET方式和分层N层应用程序的很好的介绍。

替代文字http://i.msdn.microsoft.com/ms954595.f00aa01%28en-us%2CMSDN.10%29.gif

对于更正式的“模式”,有使用Microsoft .NET的企业解决方案模式(来源:microsoft.com替代文字

仅举几例,


2

我读过的关于UI设计模式的第一个很好的解释是在Jeremy Miller的博客“ 构建自己的CAB”中。它描述了常见的模式-被动视图,MVP等,并介绍了一些您可以在C#中实现它们的方法。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.