【问题标题】:Should visual effects be implemented in the View or ViewModel?视觉效果应该在 View 还是 ViewModel 中实现?
【发布时间】:2020-07-12 05:07:36
【问题描述】:

我正在使用 Xamarin.Forms 和 FreshMVVM 作为架构开发我的第一个应用程序,但在理解 MVVM 时仍然遇到一些麻烦,更具体地说,应该在 View 中还是在 ViewModel 中处理动画? 我知道对于需要使用模型的事件,视图和其他与 UI 不严格相关的东西之间的转换是在 ViewModel 中通过绑定和命令处理的。但是 ViewModel 是否处理所有事件?如果事件只修改 UI 的外观怎么办? 例如,在按下按钮时更改按钮的背景颜色,在这种情况下,背景颜色应该在视图的代码隐藏或视图模型的命令中的 Clicked() 事件中更改? 或者,如果我想在 View 消失时制作动画,我应该在 View 的代码隐藏或 ViewModel 中的 OnDisappearing() 事件中实现它吗?

我试图找到答案,但我无法将他们的 MVVM 解释外推到这个特定场景,所以我希望能得到解释。 就是这样,谢谢大家的时间。

【问题讨论】:

  • ViewModel 不应包含任何业务逻辑,并负责修改业务模型以适应视图。实际上不应该有像SelectedIndex 这样的东西,而是像SelectedItem 这样的东西,例如。 VM 处理所有更改模型的事件,但不处理纯视图。如果只是为了外观,比如选择东西时的背景颜色,可以使用后面的代码。

标签: c# xamarin mvvm xamarin.forms viewmodel


【解决方案1】:

MVVM 模式的大部分内容都可以解释。

在大多数项目中,在 ViewModel 和 View 行为之间强制执行严格划分工作所花费的时间可能会损害时间尺度。

就我个人而言,我确保所有业务逻辑都严格保存在 ViewModel 和 Model 中,目的是即使 UI 被代码替换,系统仍应正常工作。

我尝试保留尽可能多的 UI 内容,包括视图中的动画,这可能意味着将大量代码放入背后的代码中以支持它。不要忘记,这可能还包括仅由 XAML 使用的代码库,例如值转换器,例如使用 ViewModel 中的布尔属性来切换视图的背景颜色。

有时您可能只需要让 ViewModel 操作一些数据,以便 View 可以呈现它。

我认为,务实地,这是可以接受的,但 ViewModel 不应该直接引用 UI 控件,只显示数据。

在 UI 中触发动画或事件的情况下,我个人认为拥有用于此目的的 ViewModel 属性没有任何问题,尽管有些人可能会反对。

在您提到的示例中,我认为所有这些都可以在后面的代码中执行,或者在 xaml 中使用转换器。

【讨论】:

    【解决方案2】:

    MVVM 是为了帮助我们维护干净的代码并将业务逻辑与 UI 分离。

    尽可能将 UI 保留为 View,除非它依赖或指示业务逻辑值。

    来到查询中提到的场景。

    按钮单击时背景颜色变化 => 例如,如果颜色表示业务逻辑中的值,如Value < 0,则将Value 绑定到BackgroundColor 使用转换器。但是如果它与业务逻辑无关,最好在代码隐藏文件中编写颜色更改代码。

    页面上的动画消失 => 据我所知,导航动画不可能依赖于业务逻辑。因此,最好将其保留在代码中。

    对任何疑问发表评论...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 2016-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多