2012-04-23 73 views
0

有关导航窗格(如Outlook使用的导航窗格)的简单问题。在MVVM中,谁负责显示其他视图,ViewModel或View?

在MVVM中,负责显示其他视图的ViewModel或View?

当View事件可以处理调用其他视图时,将该代码放入ViewModel似乎很愚蠢。 ViewModel根据需要启用/禁用并显示/隐藏导航项目。

回答

1

ViewModel负责视图状态。如果用户执行的任何操作恰好修改了视图状态,那么该操作的代码就属于视图模型。

因为数据绑定,我喜欢MVVM模式,但我喜欢数据绑定,因为它允许我以易于单元测试大部分代码的方式构造我的代码。该结构的一大部分是将视图状态置于一组类中,并将状态置于另一组中。

我认为人们试图实现MVVM的很多次,他们真的只是为了数据绑定的目的而实现模型 - 视图关系。这很好,因为如果他们没有提供明确的好处,就没有理由保持抽象。

所以,你的问题的答案是你想用你的视图模型实现什么?

数据绑定?把代码放在任何你喜欢它的地方。

可测性?提供关注点分离的抽象?一个纯粹的免费查看行李的模型?

然后把它放在视图模型中。

+0

我继承了一个有三个组的导航控件。每个组都有不同的做法。一个是混乱的,既有观点又有观点 - 模型相互缠绕,一堆蠕虫。一个没有视图模型,另一个没有视图模型。我想要数据绑定,但“混乱”太糟糕了。可测试性不是目标。在这一点上,我只是想创造一种一致性。 – AMissico 2012-04-24 03:06:51

+0

从你的第一段看来,View是负责任的。如果我有“Outlook”导航,那么没有视图状态。 – AMissico 2012-04-24 03:09:54

+0

@AMissico - 我不确定什么是“Outlook”导航的含义,但是如果用户点击某些内容并关闭应用程序并重新打开它,并且看起来不完全一样,那么您就有了查看状态。如果你想测试这个动作......你有查看状态。 – 2012-04-24 03:24:57

1

我倾向于对每个View有一个ViewModel,可能甚至还有一个模型。如果你的信息传递给其他视图,那么你真的需要通过ViewModel来做到这一点,如果不是的话,那么你可以通过使用视图来导航。希望这有助于:)

+1

现在,如果想要可Outlook类型的感觉,你可以使用一个选项卡控件,然后可以在一个视图模型下完成。 – TMan 2012-04-23 23:54:45

0

您正在谈论使用MVVM进行导航。

我发现它非常有用,在看这个video

这里约时间23:00解释的方法如何让优雅与导航MVVM

希望这有助于