MVVM最适合WPF使用,因为它非常适合。但是Windows窗体呢?Windows窗体是否也有这样的既定且常用的方法/设计模式?一种可以与Windows Forms完美配合的软件吗?有没有一本书或一篇文章对此进行了很好的描述?也许基于MVP或MVC?
MVVM最适合WPF使用,因为它非常适合。但是Windows窗体呢?Windows窗体是否也有这样的既定且常用的方法/设计模式?一种可以与Windows Forms完美配合的软件吗?有没有一本书或一篇文章对此进行了很好的描述?也许基于MVP或MVC?
Answers:
我尝试过MVP,它似乎也可以与Windows窗体配合使用。本书有一个带有MVP模式的Windows窗体示例(薪资示例应用程序)。该应用程序不是那么复杂,但是会为您提供有关如何创建它的想法。
C#中的敏捷原则,模式和实践 ...
您可以在源代码处获取 源代码
MVP模式有两种变体(a)被动视图和(b)监督控制器
对于复杂的数据绑定方案,我更喜欢使用Supervising控制器模式。在监督控制器模式中,数据绑定责任在于视图。因此,对于treeview / datagrid,这应该在各自的视图中,只有视图不可知逻辑才应该移到演示者上。
我建议您看一下以下MVP框架 MVC#-MVP框架
不用名字(这是一个MVP框架)。
简单的Winforms MVP视频 Winforms-MVP
处理下拉列表MVP的示例 -DropDownList
下面是代码段。...未经测试,直接从思想中键入...。
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模式工作。但是,您将使用的设计模式并不意味着您将使用正确的设计。有大量反模式附加到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/
希望这可以帮助
该模型-视图-视图模型(MVVM)模式是一种设计模式。按照定义,设计模式显示了面向对象世界中的通用解决方案,并且该解决方案可以应用于各种平台(WPF,WinForms,Java Swing等)。我同意MVVM最好与WPF一起使用,因为它利用了强大的绑定功能。但是,Windows窗体也支持数据绑定。
该WAF Windows窗体适配器说明了如何应用MVVM模式在Windows窗体应用程序。
我写了有关称为MVP-VM的MVP / MVVM设计模式的变体,这是针对Winforms应用程序的量身定制的解决方案,这些应用程序需要完整的测试范围并使用数据绑定作为使演示文稿保持模型数据更新的主要机制。
MVVM(模型视图视图模型)引入了类似的方法,用于在允许数据绑定(WPF)的环境中将表示形式与数据分离。由于.NET Framework 2.0已经提供了高级数据绑定基础结构,该基础结构还允许设计时绑定应用程序对象-“视图模型”实体非常适合基于MVP的环境。
我向两个技术人员问了同样的问题:MVVM for WindowsForms是否可能?两者都给了我完全相同的答案:“ 没办法!WindowsForms缺少WPF和Silverlight的丰富绑定(OneTime,OneWay,TwoWay,OnewayToSource),并且也缺少TypeConverters。”
同样,我们可以为WinForms使用MVVM吗?我们可以。我们拥有所有的碎片。我们只需要将它们粘合在一起。
我认为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文章
BindTree方法对我来说似乎有点缺陷。突然,视图就知道了模型。那是件好事儿吗?必须有大量的人民面临这类问题。我很惊讶没有关于它的书。由于存在有关.NET世界中所有内容的书籍。
这些设计不是要隐藏模型,而是要精确定义应用程序不同层之间的交互。您可以完全更改后端,只要您通过Bindtree传递模型,您的UI就可以继续工作。
现在,在Rajesh给出的示例中,Model类可能不是一个好的名称选择。它可以是TreeData或RecordsData。无论您如何定义它,它都具有使用Winforms的绑定机制将特定控件绑定到基础数据所需要的。
浏览此类材料的最佳网站在这里。Martin Fowler收集了各种有用的UI设计模式和企业设计模式。
同样,此操作的关键是使用接口来精确定义每一层如何相互交互。
在我自己的应用程序(用于运行金属切割机的CAD / CAM应用程序)中,我的结构看起来像这样。
您可以使用企业体系结构,模式和实践作为起点,尽管它们过时了。
在一般指导下,有.NET的应用程序体系结构:设计应用程序和服务,这是对.NET方式和分层N层应用程序的很好的介绍。
替代文字http://i.msdn.microsoft.com/ms954595.f00aa01%28en-us%2CMSDN.10%29.gif
对于更正式的“模式”,有使用Microsoft .NET的企业解决方案模式。
(来源:microsoft.com)
仅举几例,
我读过的关于UI设计模式的第一个很好的解释是在Jeremy Miller的博客“ 构建自己的CAB”中。它描述了常见的模式-被动视图,MVP等,并介绍了一些您可以在C#中实现它们的方法。
您可以尝试使用MugenMvvmToolkit,该工具允许对WinForms使用“纯MVVM”。由于它支持所有平台上的绑定,因此WPF平台上可用的所有本机绑定功能在所有平台上都可用(包括WinForms)。