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

MVVM 最常用于 WPF,因为它非常适合 WPF。但 Windows 窗体呢?Windows 窗体是否也有类似这样的既定且常用的方法/设计模式?一个显式工作良好的 Windows 窗体?有没有一本书或一篇文章能很好地描述这一点?也许是基于 MVP 或 MVC?

96955 次浏览

我已经尝试了 MVP,它似乎与窗口形式的伟大工作了。 这本书有一个例子的窗口形式与 MVP 模式(样本工资单应用程序)。这个应用程序没有那么复杂,但是它会告诉您如何创建它。

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

你可以在 源代码

编辑:

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

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

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

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

简单赢得 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);
}
}

您可以使用 企业架构、模式和实践作为起点,尽管它们稍微有些过时。

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

替换文本 http://i.msdn.microsoft.com/ms954595.f00aa01%28en-us%2cmsdn.10%29.gif

对于更正式的“模式”,有 使用 Microsoft.NET 的企业解决方案模式alt text
(来源: Microsoft.com)

举几个例子,

正如它已经说过,我总是在一个 MVP 模式工作时使用 Winform。但是您将使用的设计模式并不意味着您将使用正确的。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/

希望这个能帮上忙

BindTree 方法似乎有点 对我来说有缺陷。突然的观点 知道模特的事,这样好吗 那里一定有很多人 面对这种 我很惊讶 没有任何关于它的书。从那以后 是关于.NET 中所有内容的书籍 世界。

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

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

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

同样,关键在于使用接口来精确定义每个层之间的交互方式。

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

  • 实现表单接口的表单
  • 具有视图实现视图的 UIDLL 与表单交互的接口 通过表单界面 特定的视图自动登记 使用 UIViewDLL 视图执行找到的命令对象 在命令库中进行交互 和模特在一起。
  • 命令库; 列表 实现 ICommand 的命令。 与其交互的命令 视图通过接口这样做 在 UIViewDLL 中公开。
  • 公开视图接口 由命令使用。
  • 类的类和集合 组成我的核心数据结构 对我来说,这些都是事情 比如材料,切割路径,形状, 床单、手电筒等。
  • 实用工具; 一个通常使用 我公司使用的实用程序类 跨越不同的应用程序 复杂数学函数示例。

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

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

我使用 WinForms 中的 MVP 从 View 中提取代码-因为我不能测试 View 代码。而且还可以启用需要重用(或复制)的代码,以避免在视图中出现无法共享的代码。

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

您提到了为 WPF 工作的 MVVM ——我认为这是因为强大的数据绑定支持。如果您没有在 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 还有同一作者的一篇 MSDN 文章,发表在《 http://MSDN.microsoft.com/en-us/magazine/cc188690.aspx 》杂志上

我曾经写过一个叫做 MVP-VM 的 MVP/MVVM 设计模式的变体,它是一个针对 winform 应用程序的量身定制的解决方案,这些应用程序需要完整的测试覆盖率,并且使用数据绑定作为主要机制来保持表示与模型数据的更新。

用于.NET Winforms 的 MVVM

模型视图视图模型 引入类似的方法 将演示文稿与 环境中的数据 数据绑定(WPF) 框架2.0已经提供了高级 数据绑定基础设施 允许设计时间的约束 应用程序对象-「视图模型」 实体可以很好地适应基于 MVP 的 环境。

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

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

我问过我的两个技术同事同样的问题: 用于 Windows 窗体的 MVVM 可行吗?两个人都给了我同样的答案: “ 不会吧!WindowsForms 缺少 WPF 和 Silverlight (OneTime、 OneWay、 TwoWay、 OnewayToSource)的丰富绑定,同时也缺少 TypeConverters。”

  • Windows 窗体的屏幕激活模式-你可以找到它的 给你,从 Caliburn 移植
  • RichBindings 和 TypeConverters-由 Kent Boogaart 设计的 Truss,以一种与 UI 无关的方式实现
  • 命令 -WPF 应用程序框架(WAF)有一个 WafWinFormsAdapter 项目,用于处理一些 MVVM 东西,即命令

再一次,我们可以有用于 WinForms 的 MVVM 吗? 是的,我们可以。我们有所有的碎片。我们只需要把它们粘在一起。

您可以尝试 MugenMvvmToolkit,它允许对 WinForms 使用“纯 MVVM”。 由于它支持所有平台上的绑定,所以 WPF 平台上可用的所有本地绑定特性(包括 WinForms)都可以在所有平台上使用。