在WPF (MVVM)中使用点击事件进行小型操作是否合适?
本文关键字:小型 操作 是否 事件 MVVM WPF | 更新日期: 2023-09-27 18:06:21
我有一个使用MVVM实现的WPF应用程序。但是对于一些小操作,比如滚动,点击确认框按钮,点击左键操作,点击右键操作等,我直接在视图中使用点击事件。
我知道MVVM不建议这样做,但是在使用MVVM时,有这样的点击事件或它的坏编码实践是可以的吗?使用它的利弊是什么?
MVVM模式给你:
- 关注点分离(对所有UI模式都适用)
- 通过在没有视图的情况下执行视图模型对视图逻辑进行单元测试。
- Developer-Designer工作流,允许设计师使用Blend在相同的代码上工作。
如果在后台代码中处理UI事件不禁止上述行为,那么就没有问题。就我个人而言,如果可以的话,我会使用命令,但我不关心是否需要一些代码滞后。
可以使用Events ,但是允许代码隐藏事件的问题是它是一个滑坡。您添加一个东西,然后添加另一个,突然之间,您在代码隐藏类中创建了实际的逻辑。(如果你与团队中其他经验不足的程序员一起工作,这一点就更加突出了)。
这就是为什么有些程序员宁愿根本不写后台代码的原因,几乎没有例外。每个适合代码隐藏的代码,而不是真正的应用程序逻辑代码,也可以在一个Behavior中编写,这使得体系结构更加严格和易于定义。
如果你的按钮做了一些特定于你的UI的事情,那么是的,你应该使用事件处理程序而不是命令。
。如果你有一个按钮滚动ScrollViewer控件到底部,那么使用MVVM样式的命令将是不好的做法,因为你的ViewModel需要知识和视图的直接控制。对于这些情况,视图应该是自包含的。
如果你的按钮需要对数据做一些事情,那么你应该使用命令并在ViewModel中执行操作。
我完全同意@Noam M.的观点,只是延伸一下他的回答:
是否违反了MVVM取决于你在事件处理程序中实际做了什么。如果逻辑是由视图责任覆盖的,那就完全没问题。
-
例如,PasswordBox密码属性不能被绑定,因为它不是DependencyProperty,使用PasswordChanged eventander来设置viewmodel属性是完全可以的。但是,如果您编写针对服务器的密码验证,则会违反mvvm。
-
我经常使用Loaded/Unloaded事件来调用VM上的Activate/Deactivate方法。当我太频繁地使用它时,我创建了作为附加属性实现的行为,这为我做了,所以我不必在代码后面多次重复相同的代码
-
我经常在代码隐藏中使用DataGrid的事件,如排序等
-
我使用TextBox。GotFocus事件选择所有文本。同样,我创建的行为,当我需要重用它。
-
我使用后置代码来触发,或者创建动画,如果在xaml中太复杂的话。在这种情况下,我只是在xaml中留下评论,供其他开发人员使用。
-
在MVVM应用程序中,并非所有资产都必须严格使用MVVM编写。例如,我刚刚写了我的ModalDialogWindow,在那里我注入了内容和按钮。我没有这个控件的视图模型,我从代码后面做所有事情。但是,我的应用程序具有坚实的MVVM架构,并且我使用IDialogService显示来自页面视图模型的模态对话框。ModalDialogWindow不会破坏我的应用程序的可测试性,可混合性或可读性,因为在测试中我模拟了IDialogService,我不需要测试ModalDialogWindow UI本身。