2011-03-29 44 views
7

我正在创建一个WPF应用程序,并遵循MVVM模式。但是,在做事情时我担心这个问题,MVVM还是不符合?请带着这些怀疑指导。MVVM模式的疑问?

  1. 是否有必要为每个视图都创建一个新的ViewModel?如果不是,那么创建单个MasterViewModel是否违反了MVVM?

  2. ViewModels将如何相互沟通?

  3. MainWindow.xaml.cs我在哪里集成所有视图,应该只有viewmodel的初始化和分配的DataContext会在那里,或者我可以把其他代码呢?

  4. 我有我定义的EventHandlers。我应该在ViewModel还是model-view-viewmodel之外使用它们?

回答

3

您需要在MVVM上做一些阅读。请参见下面的问题:

Good examples of MVVM Template
Good Silverlight-MVVM Practice Example
MVVM Light Toolkit samples

对于您的问题:

  1. 有人遵循这个规则。 :One-ViewModel-Per-View请参阅Rule #2 on this article

    这并不是绝对必要的,但创建一个MasterViewModel到处使用,意味着您还没有理解MVVM。

    如果你指的是封装公共位,也许,MVVM Light Toolkit有一个ViewModelBase类用于封装一些东西。

  2. 的ViewModels不会互相沟通,会的ViewModels与意见沟通,意见将与其他意见沟通(也可能是实例化他们的ViewModels)一些框架甚至有这样的松耦合方式(ReactiveUI来介意)

  3. 当调用View时,可以实例化其相应的ViewModel,然后将其设置为DataContext。 但是,这样做有很多不同的模式。 @Ephphoric在注释中提到了ViewModel,其中ViewModel通过Ioc创建视图。见Which came first- The View or ViewModel

    MVVM Light有一个ViewModel定位器,它允许您在XAML中静态定义Views ViewModel。它会在您创建视图时自动设置。

  4. 不完全清楚在这里,(一)如果你从按钮,菜单,(任何自ButtonBase派生)事件,你应该使用这些命令模式实现。 MVVM Light有一个不错的RelayCommand<T>,这将帮助你在这里。

    (b)其他事件,MVVM Light具有EventToCommand行为,但Laurent(作者)警告说这会变成反模式。我觉得有时候你可以只使用普通的事件后面的代码,然后从那里调用你的ViewModels(但是,嘿,我在这里不是专家)


你已经问了几个问题都在那个地方。这个问题也许你不明白关于MVVM的WHY

用简单的术语来说,MVVM允许您在正确的位置保留正确的东西,在ViewModels中保存应用程序逻辑/控件,然后使用Silverlight/WPF数据绑定的强大功能将视图模型绑定到视图。因为Laurent解释,有时它不一定非常复杂。你甚至不需要一个框架。

我强烈建议看他的MIX视频标题 - 从这里“了解模型 - 视图 - 视图模型模式”
http://live.visitmix.com/Archive#VideoList

+0

“视图(以及可能的实例化的ViewModels为他们”没有在视图模型,第一个场景。 – Euphoric 2011-03-29 10:31:55

+0

感谢@euphoric。注意到,更新的问题。 – gideon 2011-03-29 11:01:53

+0

感谢@giddy ......我知道我没有清楚地理解MVVM,但我开始做这个工作,由于一些原因。无论如何,我会得到它,这一次 – PawanS 2011-03-29 11:38:08

2

是需要有一个新的视图模型为每一位观?如果不是,那么创建单个MasterViewModel是否违反了MVVM?

没有,你可以在一个单一的视图模型的多个视图,虽然它是典型的有一个视图模型到一个视图的关系。如果您在考虑所有视图的主视图模型,那么它很快就会变得难以管理。

所有ViewModel如何相互通信?

有几种方法,包括视图模型,标准.NET事件或事件聚合器模式之间的直接引用。

MainWindow.xaml.cs,在那里我为 整合各方面的意见,应该有 仅视图模型 的初始化和分配的DataContext将 不见我可以把其他的代码也?

通常在MVVM中,您将没有(或很少)代码,并且在WPF应用程序中使用XAML绑定引擎,而不是用于viewmodel/view通信。

我有我定义的EventHandlers。 我应该在model-view-viewmodel以外的ViewModel或 中使用它们吗?

不太清楚这是什么意思,但如果需要,您可以使用标准事件进行视图模型通信。

我会认真考虑为您的应用程序使用MVVM框架,我的个人偏好是Caliburn.Micro

2

[1]是否有必要为每个View创建一个新的ViewModel?如果 不是,那么MasterViewModel是否可以创建单个的违反MVVM?

通常,您需要为每个View实例同时使用一个新的ViewModel实例,并且每个View类都需要一个不同的ViewModel类。有时候你需要同一个ViewModel的多个视图,这是可以的。如果你要使用ViewModel优先方法,那么你可能并不总是需要每个ViewModel类的View类,但是它也不会伤害到它。

[2] ViewModel如何相互通信?

如果ViewModel直接相关(例如,父/子关系),那么一种可能性是一方可以直接引用另一方,或者一方可以订阅另一方的事件。

如果ViewModel在逻辑上是独立的,那么您应该使用其他一些机制,比如Event Aggregator(在Prism中)或者Messenger(MVVM Light)或者其他的机制。

[3]这里我整合各方面的意见MainWindow.xaml.cs,应该有 仅视图模型 的初始化和分配的DataContext将 不见我可以把其他的代码也?

您不应该在View代码隐藏中初始化ViewModels。模型应通过依赖注入(DI)容器注入到视图中。

[4]我有我定义的EventHandlers。我应该在 ViewModel中使用它们还是在 model-view-viewmodel之外使用它们?

我听不懂你在问什么。

+0

+1很好的答案。对于(3)即使您强烈地键入虚拟机彼此没有关系,您是否认为这是必要的?你将有和接口然后为每个虚拟机? – gideon 2011-03-29 11:05:53

+0

@jon ....你可以给任何示例代码或链接。在维基百科中查找'Control'(第一)的反演'依赖Injection'(秒):我没有得到任何例如用于DI,因为我知道视图代码后面不应该包含任何行为相关的代码... – PawanS 2011-03-30 06:38:18

+0

@GAPS - 有很好的简短介绍和参考资料,以及更多的链接。 – Jon 2011-03-30 15:59:48

1

1.是否有必要为每个视图都有一个新的ViewModel?如果不是,那么创建单个MasterViewModel是否违反了MVVM?

不是。您可以使某些ViewModel与大量视图对应,每个视图以不同的格式显示相同的数据。实际上,这首先是MVVM的基本原理 - 隔离显示和业务规则,以便通过加载不同的视图来改变显示格式。

你也可以有一个View对应多个不同的ViewModels。这是显示UI上的代码重用。

2. ViewModel如何相互通信?

通常ViewModels通过WPF绑定与视图进行通信。这就是为什么它被称为MVVM而不是MVC。

ViewModels可以通过一些标准的.NET手段相互通信。

3. MainWindow.xaml.cs我集成了所有视图,应该只有viewmodel的初始化和分配的DataContext会在那里,或者我可以把其他代码呢?

您通常会将每个视图分隔为单独的XAML文件。这可以很容易地替换另一个视图来获取不同格式的相同数据。

通常,建议是您的代码分离成自包含模块;即一个视图一个文件,一个视图模型一个文件。

4.我有我的定义事件处理器。我应该在ViewModel还是model-view-viewmodel之外使用它们?

活动应应看法,如果他们是纯粹的UI驱动的处理(即没有任何与数据做)。

如果事件应该不会影响底层数据的一些变化(或做业务规则的一些动作),就可以反过来提高对视图模型的事件。请注意,ViewModel上的此事件可能与View/UI上的事件不同。