是事件,而不是MVVM中的命令?

如何解决是事件,而不是MVVM中的命令?

| MVVM的各种教程中通常都指定了MVVM的目标不是消除背后的代码,而在背后的代码中仍可能需要某些事件处理。 在哪些情况下需要在代码背后编写事件而不是在viewmodel中使用命令?     

解决方法

通常,如果您的代码与UI逻辑有关,则将其保留在视图的XAML中或隐藏在代码中。视图模型仅负责在视图和模型之间桥接和绑定数据。 在我的一个问题中可以找到一个示例:如何通过拖动扩展的窗框使WPF窗口移动?我使用的事件之一是“ 0”,在其中访问“ 1”的窗口句柄以执行一些Windows API魔术。但是所有这些都与窗口有关,并且与窗口之外的应用程序逻辑无关,因此我将所有内容都限制在窗口的代码隐藏文件中,而视图模型完全不了解它。     ,我认为,在MVVM中,当与UI相关的事件(如animation)时,您可以在代码隐藏文件中编写。 所有业务逻辑都应在视图模型中。     ,以我的经验,使用不支持MVVM绑定的第3方控件将导致在文件后面的代码中编写代码。即使对于简单的用法(例如选择当前项目,读取当前选择的项目等),也会发生这种情况,这在控件中应该很容易实现,但实际上并不是。 一个示例是Silverlight TreeView控件的SelectedItem属性,该属性不是DependencyProperty(可绑定)是常规属性,因此您无法绑定到该属性。 就像@BoltClock提到的那样,有时在代码中放置一些与视图的工作确实相关并且与逻辑“在视图后方”无关的代码似乎是合乎逻辑的。最好将这些逻辑放在后面的代码中。     ,您总是会遇到纯粹主义者,他们说在代码隐藏文件中绝对不应有任何代码。我通常是一个纯粹主义者,但在这种情况下不是。 如果您有非常特定于视图的逻辑,则应将其放在代码隐藏文件中。当我编写复杂的视图时,需要根据属性或视图模型的更改对可视化树的结构进行大的更改,我会将这段代码放在视图中。视图模型应该对视图一无所知,因此它不能(也不应该)直接控制这些更改。有时,可以使用Style或DataTemplate中的Triggers来实现这些更改,但是有时,良好的老式代码是最好的方法。     ,我认为自定义用户控件可能在后面使用代码。 假设您创建一个继承TabItem的Closable Tab Item类。您可以使用事件处理该关闭操作,并将其绑定到DP。 这当然是通用的,可以多次使用。 因此,我认为当事件与UI有关而不是与dataModel或其他活动有关时,可以接受后面的代码。     ,我遇到的一种情况是使用第三方控制。一些第三方控件(例如telerik grid)在内部使用自己的自定义数据类型来表示网格行等,并且您需要处理各种网格事件,以将这些特定于UI的类型转换为您的custion类型,然后将它们传递给VM。     ,我要说的是,如果要移植到另一个桌面UI(例如mac),则需要与之不同的任何“逻辑”都应该在后面的代码中。 (例如,其他具有大致相同的逻辑UI需求的平台) 因此,在使用“悬停”在输入字段上时,应将所有事件挂接以使其分离,但应在视图模型中确定用户悬停在“状态行”中显示的内容。     ,我没有找到一种很好的方法来绑定列表框中的多个项目,因此只能在后面的代码中完成。但这不是“不干净的”     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-