Windows窗体的UIdevise模式(如WPF的MVVM)

MVVM是最常用的WPF,因为它非常适合它。 但是Windows窗体呢? 对于Windows Forms,有没有一个常用的方法/devise模式? 一个与Windows窗体明确工作? 有没有一本书或一篇文章能够很好地描述这一点? 也许基于MVP或MVC?

我曾尝试MVP,它似乎也与Windows窗体很好地工作。 这本书有一个MVP模式的窗体示例(示例工资应用程序)。 该应用程序不是那么复杂,但会给你一个关于如何去创build它的想法。

敏捷原则,模式和C#中的做法 …

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

编辑:

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

对于复杂的数据绑定场景,我更愿意使用监督控制器模式。 在监督控制器模式的数据绑定责任与观点。 所以,对于treeview / datagrid应该在相应的视图中,只有视图不可知的逻辑应该移动到演示者。

我build议看看下面的MVP框架MVC# – 一个MVP框架

不要按名称(这是一个MVP框架)。

简单的winforms MVPvideoWinforms – MVP

处理下拉列表MVP – DropDownList的一个例子

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

下面是代码片段….没有testing,直接键入思想….

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); } } 

正如已经说过的,当我使用Winforms的时候,我总是使用MVP模式。 但是你使用的devise模式并不意味着你会使用正确的。 有很多反模式附加到MVP。

如果你想以良好的方式开始一切,你必须使用框架来构build智能客户端。 所以我会build议使用这种devise和实践: 智能客户端软件工厂 http://www.codeplex.com/smartclient

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

PS:我喜欢这个MVP反模式的post: http : //blog.mattwynne.net/2007/06/13/mvp-smells/

希望这可以帮助

我读过的最好的文章来自Martin Fowler的博客。 这里:

http://martinfowler.com/eaaDev/uiArchs.html

Model-View-ViewModel(MVVM)模式是一种devise模式。 根据定义,devise模式在面向对象的世界中展示了一个通用的解决scheme,这个解决scheme可以应用于各种平台(WPF,WinForms,Java Swing等)。 我同意MVVM最适用于WPF,因为它利用了强大的绑定function。 但是,Windows窗体也支持数据绑定。

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

下面的文章介绍了MVP / MVVMdevise模式的一种变体MVP-VM,这是一个量身定制的解决scheme,用于winforms应用程序,需要全面的testing覆盖率,并使用数据绑定作为保持演示模型数据更新的主要机制。

MVVM为.NET Winforms

MVVM(模型视图视图模型)在赋予数据绑定(WPF)的环境中引入了类似的方法来将表示与数据分离。 由于.NET Framework 2.0已经提供了高级数据绑定基础设施,也允许应用程序对象的devise时绑定 – “视图模型”实体可以很好地适应基于MVP的环境。

我相信MVP是一个非常适合于WinForms开发的模式(部分certificate了它在CAB中的突出用途 – 围绕WinForms应用程序的微软框架)。

我在WinForms应用程序中使用MVP,主要是为了从视图中提取代码,因为我不能/不会testing视图代码。 还可以启用需要重复使用(或重复)的代码,使其不能轻易共享。

作为MVP在WinForms中效果的一些证据,我将参考我自己的项目。 我在ExceptionReporter项目( http://www.codeplex.com/ExceptionReporter )上工作,我实际上需要在WPF和WinForms“版本”之间重用代码。 因此,我对这两种技术都使用了MVP – 这使我可以在两个程序集之间共享同一个Presenter。 并避免重复该代码。

你提到MVVM为WPF工作 – 我认为这是因为强大的数据绑定支持。 如果你没有在WPF中使用数据绑定(当然不是强制的),那么你可以selectMVP。 关键在于MVP是任何客户端应用程序的强有力的select。 如果您打算在不是WPF的项目之间共享代码,甚至在WPF中,也可能是“更好的”select。

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

您可以使用企业架构,模式和实践作为起点,虽然它们有些过时。

在一般指导下,有.NET的应用程序架构:devise应用程序和服务 ,这是对.NET方法和分层N层应用程序的一个很好的介绍。

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

对于更正式的“模式”,有使用Microsoft .NET的企业解决scheme模式 。 替代文字http://i.msdn.microsoft.com/ms998492.Chp_02OrganizingPatterns_Fig06%28en-us%2CMSDN.10%29.gif

仅举几例,

  • 模型-视图-控制器
  • 拦截filter
  • 三层服务应用程序

BindTree方法对我来说似乎有一点缺陷。 突然间,视图就知道了模型。 那是件好事儿吗? 必须有很多人面临这样的问题。 我很惊讶,没有任何关于它的书籍。 由于在.NET世界中有关于所有东西的书籍。

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

现在在Rajesh给出的例子中,类模型可能是一个糟糕的select。 它可以是TreeData或RecordsData。 但是,您可以定义它,它具有使用Winforms的绑定机制将特定控件绑定到基础数据所需的内容。

浏览这种材料的最佳网站就在这里 。 Martin Fowler收集了各种有用的UIdevise模式和企业devise模式。

再次,关键是使用接口来精确定义每个层如何相互作用。

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

  • 实现表单接口的表单
  • UIDLL具有实现视图接口的视图,该视图接口通过表单接口与表单交互。 具体视图注册自己与UIViewDLL视图执行命令库中发现的命令库,与模型交互。
  • 命令库; 执行ICommand的命令列表。 与视图交互的命令通过UIViewDLL中公开的接口来完成。
  • UIViewDLL; 公开了这些命令使用的视图接口。
  • 模型; 构成我的应用程序的核心数据结构的类和集合。 对我来说,这些东西就像材料,path,形状,床单,火把等等。
  • 效用; 一个常用公用程序类使用的DLL,跨越不同的应用程序。 例如复杂的math函数。

我向我的两位技术人员同事提出了同样的问题:是否可以使用MVVM for WindowsForms? 两者都给了我完全相同的答案:“ 没办法!WindowsForms缺lessWPF和Silverlight(OneTime,OneWay,TwoWay,OnewayToSource)的丰富绑定,也缺lessTypeConverters

  • WindowsForms的屏幕激活模式 – 你可以在这里find它,由jagui从Caliburn.Micro移植
  • Rich Bindings和TypeConverters – Kent Boogaart的Truss以独立于UI的方式完成
  • 命令 – WPF应用程序框架(WAF)有一个WafWinFormsAdapter项目,负责照顾一些MVVM的东西,即命令

再次,我们可以有WinForms MVVM吗? 我们可以。 我们有所有的作品。 我们只需要把它们粘在一起。

对于我读的UIdevise模式的第一个很好的解释是在Jeremy Miller的博客 – build立你自己的CAB 。 它描述了常见的模式 – 被动视图,MVP等,并解决了一些你可能在C#中实现它们的方法。

你可以尝试MugenMvvmToolkit ,允许使用WinForms的“纯MVVM”。 由于它支持所有平台上的绑定,因此所有平台上可用的所有WPF平台的本机绑定function(包括WinForms)都可用。