C# MVVM中各层的角色
我知道在MVVM中,我们希望通过数据绑定将用户输入从视图传播到视图模型,并将视图模型中反映的视图状态提供给模型,在模型中我们编写业务逻辑代码,并通过事件将结果更新给用户。C# MVVM中各层的角色,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,我知道在MVVM中,我们希望通过数据绑定将用户输入从视图传播到视图模型,并将视图模型中反映的视图状态提供给模型,在模型中我们编写业务逻辑代码,并通过事件将结果更新给用户。 但是,这是否意味着视图中的每个更改都必须在xaml.cs文件之外进行 以WPF应用程序为例: 如果我们想写一个算法来解决这个难题,我们将把代码放在模型中 但是,假设我们希望在用户单击向下键后更新网格。 是否应该在视图中检查这种移动是否可行,重新绘制棋盘或给玩家任何反馈(如果移动合法或否)?(xaml.cs文件) 更一般地说,是
但是,这是否意味着视图中的每个更改都必须在xaml.cs文件之外进行
以WPF应用程序为例:
如果我们想写一个算法来解决这个难题,我们将把代码放在模型中
但是,假设我们希望在用户单击向下键后更新网格。 是否应该在视图中检查这种移动是否可行,重新绘制棋盘或给玩家任何反馈(如果移动合法或否)?(xaml.cs文件)
更一般地说,是否有“经验法则”来决定在哪里处理什么?MVVM层的快速回顾(或“经验法则”):
- 模型:仅包含视图模型使用的数据。作为一个示例,将来自数据库的业务对象视为“模型”。
- 视图:用户与视图模型之间的连接。可以对同一视图模型使用多个视图。如果视图模型发生更改和更新,则视图应显示更改
- 视图模型:包含视图和模型之间的“业务逻辑”。因此,命令、可能的操作和算法都存储在这里。视图模型决定了什么是可能的,什么不是
foo
切换到另一个视图bar
以显示您的谜题,并且您确实在视图中放置了关于“什么是可能的”的决策,那么您必须在新视图bar
中重写决策树/算法,从而复制代码/逻辑
当决策更高层时,视图反映视图模型告诉他的内容。如果视图模型希望视图“刷新”或告诉用户“嘿,这是非法移动”,则视图模型将通过和事件来执行此操作。收到此类事件后,视图可以决定如何处理它:
- 显示有关非法移动的错误消息
- 显示移动非法的工具提示
- 闪烁并用嘟嘟声摇动窗口,表明该移动是非法的
- 更多的实现
- 模型(用于序列化,逻辑很少)
- 视图模型(具有视图的属性更改绑定)和
- 视图(薄层,几乎直接绑定到视图模型)
- 这里更容易有逻辑,因此视图绑定可以工作
- 这是视图模型层膨胀的阶段
- MVM:这是常见的、与业务相关的逻辑/对象所在的位置
- MVM对象包含任何视图都可以绑定到的真正通用属性
- VVM:这几乎是WPF视图的1对1复制
- 这些对象通常不会在其自身视图之外共享
- MVM和VVM的分离有助于防止单个视图模型类满足任何视图的需求(即整组
和Is(选中|选中|等)
,它们只能由一个视图专用)*命令
- (对一些人来说,VVM逻辑可能是观点的一部分。但对我来说,我经常发现自己最终希望当初为了测试而将它们分开。所以现在我这样做了。)
- 应用程序的层次结构几乎从来都不是真正静态的李>
- 即使您构建了尽可能最好的应用程序版本,客户机也只需要更多