我知道在MVVM中,我们希望通过数据绑定将用户输入从视图传播到视图模型,并在查看模型到模型,我们编写业务逻辑代码,并通过事件用结果更新用户。
但是,是否意味着视图中的每个更改都必须在xaml.cs文件之外完成?
例如,sliding puzzle的WPF应用程序:
如果我们想编写一个算法来解决难题,我们将把代码放在模型中。
但是,假设我们想在用户单击向下键后更新网格。
检查是否可以进行此类移动,重新绘制棋盘或给予玩家任何反馈(如果移动是合法的还是没有)应该在视图中完成? (xaml.cs文件)
更一般地说,是否有"经验法则"决定在哪里处理?
答案 0 :(得分:2)
快速回顾一下MVVM层(或“经验法则”):
层之间的通信需要(这是MVVM所必需的部分)可互换,这意味着视图模型可以与不同的兼容性视图一起使用,并且该模型可以由不同的兼容性视图模型使用。要减少多个图层的依赖关系:图层不应直接在它们之间进行通信。我们使用命令,事件和直接绑定。
但是,是否意味着视图中的每个更改都必须在xaml.cs文件之外完成? [...]但是,假设我们想在用户点击向下键后更新网格。检查是否可以进行此类移动,重新绘制棋盘或给予玩家任何反馈(如果移动是合法的还是没有)应该在视图中完成? (xaml.cs文件)
没有。视图模型应该明确地告诉视图哪些是可能的,哪些是不可能的。该视图显示该操作是否可行:如果可能,它不会决定。这样的决定是在业务逻辑中,因此在视图模型中。
作为思考的一部分,请理解可互换的视图。如果您为另一个视图foo
切换视图bar
以显示您的拼图,并且您确实在视图中做出了“可能有什么”的决定,那么您将不得不重写决策树/算法。新视图bar
,因此,重复代码/逻辑。
当决定更高时,视图会反映视图模型告诉他的内容。如果视图模型希望视图“刷新”或告诉用户“嘿,这是非法移动”,视图模型将通过commands和事件来完成。收到此类事件后,视图可以决定如何处理它:
我希望尽可能彻底地回答你的问题。
答案 1 :(得分:0)
我的10美分:
如果我的经历教会了我什么,那么用相同的一般解决方案来解决所有问题几乎是不可能的。
在MVVM的情况下,我学到了一些东西(困难的方法):
相反,我的做法通常是:
当应用程序最终运行时,开始重构
视图模型最有可能被重构为2层:MVM(模型 - 视图 - 模型)和VVM(视图模型)
Is(Selected|Checked|etc)
和*Command
,只能由一个视图使用)。随着应用程序的发展,属性/方法可以从MVM推送到VVM,反之亦然。
拥有重构现有架构以满足新要求的专有技术>设计一个足够灵活的架构,以满足未来的任何需求
说了这么多,对于许多不太复杂的应用程序,略微凸起的View模型通常都足够好。