MVVM - 视图逻辑:视图与视图模型[关闭]

2024-01-16

“应该”视图逻辑通常驻留在哪里?在视图中(包括后面的代码)还是在视图模型中?

从逻辑上讲,我理解用于修改视图(使其动态)、更改其元素属性的任何内容:Visibility, IsEnabled, Content等基于一些状况.

我在选择正确的陈述之间挣扎:

  1. ViewModel 负责所有视图“属性”,如果视图需要一些逻辑 - 这应该是 viewmodel 的工作。

  2. 视图是视图模型的呈现,视图模型只需要最少的暴露模型,因此逻辑应该是视图的一部分。

视图中的逻辑。

一个例子,显示一些文本:

<Grid Visibility="{Binding TextAvailable, Converter=...}">
    <TextBlock Text="{Binding Text}" Visibility="{Binding TextOk, Converter=...}" />
</Grid>

通过查看这个 xaml,您知道 viewmodel 中有 2 个属性:TextAvailable and TextOk,用于有条件地显示Text.

使用数据触发器也可以实现同样的效果。方式无关紧要,重点是:逻辑在视图中。人们必须彻底浏览视图才能理解以下两点:逻辑和执行.

视图模型中的逻辑。

Xaml 更容易:

<TextBlock Text="{Binding Text}" Visibility="{Binding ShowText, Converter=...}" />

and 逻辑在视图模型中:

public bool ShowText => TextAvailable && TextOk;

但这需要通知支持,通常订阅/取消订阅事件(如果确定性取消订阅很复杂,则使用弱事件),以便能够tell风景OnPropertyChanged(nameof(ShowText))如果任何相关属性发生更改。因此执行在许多方法/属性中广泛传播。


我个人更喜欢简单的视图模型和相当复杂的视图(xaml),充满逻辑。最近我找到了办法 https://stackoverflow.com/a/48525675/1997232让逻辑看起来非常酷(没有额外的元素并且更容易看到)。

我了解这两种方法都可以使用,因此问题是基于意见的,但我不想在我的软件中以疯狂的比例混合这两种方法。哪条路比较多clean并且会被另一个 MVVM 程序员更好地接受吗?我应该选择什么以及为什么?


我认为答案是做任何你觉得舒服的事情。我不认为一种方法客观上优于另一种方法。

我想在纯 MVVM 场景中,ViewModel 不知道其视图,也不知道其数据将如何显示。在实践中我认为这种情况很少遇到。大多数时候,在编写 ViewModel 代码时,您将非常了解其数据将如何显示和交互:换句话说,您将知道 View 将是什么样子,以及它将如何表现。

鉴于此,我认为将一些 UI 逻辑放入 ViewModel 中并不是一个问题。我的意思不是直接操作视图中的 UI 元素;而是指直接操作视图中的 UI 元素。相反,在 ViewModel 上拥有视图将绑定到的属性,例如示例中的 Boolean 属性。逻辑越复杂,我就越有可能将其放置在 ViewModel 中,尽管您可以通过可见性转换器和数据触发器在视图中执行逻辑,但 XAML 可能会变得非常冗长。这并不是说我从不使用这些 XAML 功能,只是我通常会使用它们来实现更简单的逻辑。

归根结底,ViewModel 是用来支持 View 的:本质上是为它提供 View 的 UI 元素可以绑定的属性,从而提供两者可以进行通信的管道。你的选择,基于你想要实现的MVVM的纯度,就是你想让ViewModel支持View的程度,以及你想让View被隔离的程度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVVM - 视图逻辑:视图与视图模型[关闭] 的相关文章

随机推荐

  • Logstash Web UI 无法启动

    当我尝试使用 Web 前端启动 Logstash 时 我遇到了异常 尽管我遵循了以下位置的所有步骤官方教程 http logstash net docs 1 1 10 tutorials getting started centralize
  • 使用 iOS 访问相机

    显然 有些人已经能够弄清楚如何通过 SDK 访问 iPhone 摄像头 例如 Spore Origins 如何才能做到这一点 您需要使用UIImagePickerController类 基本上 UIImagePickerController
  • 在 vb.net 中读取文件中的字节

    获取文件名后 我创建一个新的文件流并将 FileStream 中的所有字节加载到字节数组中 现在我需要获取某些字节并将它们存储在字段中 例如第二个 4 个字节是创建文件的时间 当将它们存储在变量中时 我应该将它们存储为字节或字符串 整数 等
  • eclipse 中未定义的引用 glBindVertexArrayOES、glGenVertexArraysOES、glDeleteVertexArraysOES

    尝试使用 Android NDK 编译 C 代码 但这些错误不会消失 undefined reference to glBindVertexArrayOES undefined reference to glGenVertexArraysO
  • webpack + babel - 反应,意外的令牌“导入”

    我正在努力使index js https github com logary logary js blob master examples webpack index js与 es2015 一起工作 在引导我访问 babelrc 之前 请注
  • 防止用户在文本框中触发空格

    之前我用jQuery处理这个问题的方法如下 textInput keydown function e return e which 32 您将如何使用新的 Angular 和 Typescript 来处理它 或者简单地说
  • 使用 python winrt 模块进行 Windows Toast 通知和操作

    我已经尝试让它工作很长时间了 但我总是陷入检测按钮按下的困境 我做了一个 toast 通知 如下所示 这是我的代码 import winrt windows ui notifications as notifications import
  • SQLite 的小数位问题

    我有一个 SQLite3 表 其中一列的格式为 DECIMAL 7 2 但是每当我选择值不具有非零小数点第二位 例如 3 00 或 3 10 的行时 结果总是有尾随零缺失 例如 3 或 3 1 有什么方法可以在 SELECT 语句中应用格式
  • Gem::LoadError:为数据库适配器指定了“sqlite3”,但未加载 gem

    我正在尝试将我的应用程序推送到 heroku 但收到此消息 Gem LoadError Specified sqlite3 for database adaptor but the gem is not loaded 但我没有 我的 dat
  • 从 Docker 容器进行 dotnet 恢复失败

    我在过去的几天里研究了这个问题 但我发现的研究都没有帮助我解决这个问题 包括重新启动 Docker 重新启动 Docker 服务 重新启动 Visual Studio 删除 Nuget 调整代理设置 调整 Nuget config 等 最终
  • 调试:当类型标记为可序列化时,如何调试“类型未标记为可序列化”异常

    我试图 Request Params crmid null 在网页中 但它不断抛出序列化异常 在中键入 QC Security SL SiteUser 装配 QC Security 版本 1 0 0 1 文化 中立 PublicKeyTok
  • 在 C# 中访问 WindowsInstaller.Installer COM 对象

    我找到了一个不错的Powershell功能 https gist github com MyITGuy 153fc0f553d840631269720a56be5136在 GitHub 上 它使用 WindowsInstaller Inst
  • ASP.NET MVC 3 Razor 递归函数

    好的 所以我想显示一个包含列表列表的列表 我无法知道要显示多少层 所以我想这就是我打破旧的递归例程的地方 不过 我在具体如何解决这个问题上遇到了麻烦 这是我到目前为止所拥有的 视图 简化 foreach MyObject item in M
  • HTML 页脚问题

    是否可以创建一个位于网站底部的页脚 div 无论中间有多少信息 目前 我的 div 的位置取决于我的正文中有多少内容 也可以看看 如何让页脚停留在网页的底部 https stackoverflow com questions 42294 h
  • 将一个项目的 Dll 引用引用到另一个项目

    我有 2 个项目 一个是用 VB NET 构建的 另一个是用 C NET 构建的 我想在 C NET 中使用 VB NET 的某些功能 因此我通过从系统浏览 dll 将 VB NET 解决方案的 dll 文件添加到 C NET 中作为参考
  • 如何将邻接矩阵保存为 CSV 文件?

    我在 R 中使用 CSV 文件创建了一个邻接矩阵 如下所示 Gene1 Gene2 Weight A B 1 A C 0 5 B D 0 5 A D 1 这是我的 R 代码 el read csv my csv sep t library
  • 为什么 std::getline 不阻塞?

    我在 Objective C 类中 在 Objective C 文件中 有以下代码 NSString readString string res std getline cin res return NSString stringWithC
  • Android:如何使用 HttpsURLConnection 以编程方式登录网页

    我是 Android 新手 也是 Java 新手 如果我的问题是一个基本命题 那么很抱歉 我必须编写一个 Android 应用程序 在后台登录一个 aspx 网页 从中获取一些数据 然后从该网页注销 并以编程方式完成这一切 基本上 该过程就
  • 使用 datetime.strftime 显示时区偏移中的 : 字符 [重复]

    这个问题在这里已经有答案了 给出的格式字符串是什么strftime这将给出与我看到的相同的输出isoformat gt gt gt from datetime import datetime gt gt gt import pytz gt
  • MVVM - 视图逻辑:视图与视图模型[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 应该 视图逻辑通常驻留在哪里 在视图中 包括后面的代码 还是在视图模型中 从逻辑上讲 我理解用于修改视图 使其动态 更改其元素属性的任何内容 V