2012-07-14 71 views
0

我认为我对MVVM设计模型有很好的理解,但是我对WPF,Command绑定以及我们如何使用它们有兴趣。MVVM - 与WPF命令绑定标准相关

要直接将命令绑定到XAML,我们打算在ViewModel中实现ICommand接口。现在,ICommand接口是PresentationCore.DLL的一部分,如果im错误是WPF而不是基本.NET框架的一部分,那么请纠正我。

是不是ViewModel和Model的整个点,它应该完全UI独立?例如,如果我在ViewModel中实现ICommand并将其用作数据上下文以绑定来自XAML的命令,则我的ViewModel不依赖于WPF框架工作(特别是PresentationCore.Dll)。

我的意思是,如果我要去尝试使用我的模型和ViewModels可以说Windows窗体环境,我将不得不引用PresentationCore.DLL,即使我不应该需要它,因为即时通讯使用Windows窗体而不是WPF框架。

这对我来说似乎有点奇怪,我在这里错过了什么吗?有没有另外一种方法可以让我的Model和ViewModel完全独立于UI和UI框架,但是仍然能够在XAML中使用Command绑定?

在此先感谢!

+0

在这一点上我有我自己唯一的解决办法是创建两个视图模型,有一个XXXViewModel和XXXViewModelWPF继承自XXXViewModel并包含所有与ICommand相关的东西,那么XXXViewModelWPF类只会成为WPF。有没有更好的办法?谢谢 – 2012-07-14 06:20:47

回答

1

我也有这种问题,但不是在wpf中,而是在POCO类中。我所做的是我在两个不同的程序集中创建了两个部分类。就像你创建一个不是presentationcore.dll依赖于您的VM项目的分部类,并在另一个实现ICommand的程序集(比如WPFVM)中创建它的分部类。现在Winforms的东西只添加VM项目引用到View项目,而WPF的东西添加VM和WPFVM到View项目的引用。我希望这将有所帮助。

+0

感谢ethicallogics,我决定已经这样做了,除了使用部分类im,我将为每个ViewModel创建一个叫做XXXViewModelWPF的子类,它具有ICommand属性。正如你所说,这样我就不会在我的Windows窗体实现中包含XXXViewModelWPF!这是个好主意,谢谢。 – 2012-07-14 06:41:32

1

MVVM的意义在于让视图成为视图,仅此而已。将ICommands放入视图模型会有助于实现这一点,因为它将代码从视图中拉出。如果您必须访问不属于依赖项属性的视图上的某些内容,这意味着您无法绑定它。

+0

感谢您的回答,所以我对MVVM模型的解释是不正确的? ViewModel的重点不是从逻辑中抽象视图,而是从视图中移除所有代码。所以如果我要将我的程序移动到Windows窗体,我将不得不重新编写视图模型和视图,而不仅仅是视图?我认为设计模式的重点是限制UI设计更改时所需的返工? – 2012-07-14 06:24:32

+0

MVVM是专门为WPF设计的。我不知道它将如何与Windows窗体一起工作。我同意限制返工,但是因为WPF和Winforms是如此不同,所以我不知道在视图模型中切换即使没有ICommmand也是多么容易。 – jle 2012-07-14 06:33:01

+0

好的,谢谢,我真的没有看到使用我的ViewModels和Models在Windows窗体应用程序中,目前除了ICommand实现外。例如,Windows窗体控件可能包含对ViewModel的引用,并挂钩其OnPropertyChanged事件以根据需要使其自身失效。 Paint消息将根据ViewModel的当前状态进行简单绘制。我想我会在原始问题的主题中使用我的评论,你能想到其他方式吗? – 2012-07-14 06:37:01

1

在我看来,MVVM非常受WPF和Silverlight的欢迎,因为它自然适合它。 XAML中的数据绑定概念允许使用DataContext的单个属性来桥接视图模型的视图&。由于您的逻辑不再与控件绑定,因此您可以获得更好的可测试性,设计代码分离和可维护性。您也许能够在其他地方实现MVVM模式,但在WPF和Silverlight中,由于其数据和命令绑定支持,它非常​​适合。我曾在某处读过,不要虔诚地采取模式。他们是为了让你的生活变得更简单,而不是在追随它时给你更多的问题。对于Winforms,我认为有更好的模式,如果您专注于重用业务逻辑,请将它们从ViewModel中移出,以便像服务提供商或服务代理那样分离类,然后在Winforms和WPF应用程序之间共享它们。

+0

感谢Moble Joseph,我想可以这样做,但对我来说,更多的不便是试图将所有业务逻辑抽象为单独的类,而不直接访问要应用于这些业务规则的信息。所有的数据都需要传递给这些类。我仍然认为我的最佳选择是创建WPF命令的后代ViewModels,unles im不能正确理解你? – 2012-07-14 06:56:54

+0

那么目前你在这些命令中做你的业务逻辑?您不使用某个数据传输对象将业务规则分离到单独的类中? – 2012-07-14 07:12:00

+0

逻辑并不十分复杂,以至于程序dosnt使用数据库作为后端,它只是存储在模型中的对象的状态信息,然后ViewModel负责通过事件通知事件的视图(在这种情况下是PropertyChanged事件)。所以是的,程序的所有逻辑都在ViewModel中,据我所知,基本的MVVM只支持Model,ViewModel和查看任何额外的东西在MVVM之上?如果你想知道它的拼字游戏板解算器。然而,求解器代码被抽象为单独的类 – 2012-07-14 07:22:11

1

这改变了在.NET 4.5比较

+0

感谢这个1月,我不知道是否有人在微软阅读我的意见,并决定移动它,但现在它是系统中的.NET基础框架的一部分,欢呼声! – 2013-05-19 11:18:31