在WPF(MVVM)中对小型操作使用单击事件是否可以?

时间:2015-08-05 06:42:31

标签: c# wpf xaml mvvm

我有一个使用MVVM实现的WPF应用程序。但是对于一些小的操作,例如滚动,确认框按钮单击,左键单击操作,右键单击操作等,我在视图中直接使用click事件。

我知道MVVM不推荐这样做,但在使用MVVM时是否可以使用这样的点击事件或编码错误?使用它有什么利弊?

3 个答案:

答案 0 :(得分:5)

MVVM模式为您提供:

  • 关注点分离(所有UI模式都适用)
  • 通过执行不带视图的视图模型对视图逻辑进行单元测试。
  • Developer-Designer工作流程,允许设计师使用Blend处理相同的代码。

如果在后面的代码中处理UI事件并不禁止上述内容,则没有问题。我个人会尽可能使用命令,但不关心是否需要一些代码隐藏。

事件可以使用,但允许代码隐藏事件的问题在于它是一个滑坡。你添加一个东西,然后添加另一个东西,突然间你在codebehind类中创建了实际的逻辑。 (如果你和团队中其他经验不足的程序员一起工作,那就更加突出了。)

这就是为什么有些程序员更喜欢,几乎没有例外,不想编写AT ALL代码。 每个代码都适合代码隐藏而不是真正的应用程序逻辑代码也可以在行为中编写,这使得体系结构更加严格和简单。

答案 1 :(得分:1)

如果您的按钮执行了特定于UI的操作,那么您应该使用事件处理程序而不是命令。

e.g。如果您有一个将ScrollViewer控件滚动到底部的按钮,那么使用MVVM样式命令将是不好的做法,因为您的ViewModel需要知识并直接控制视图。对于这些情况,视图应该是自包含的。

如果您的按钮需要对数据执行某些操作,那么您应该使用命令并在ViewModel中执行操作。

答案 2 :(得分:1)

我完全赞同@Noam M.只是为了扩展他的回答:

是否违反MVVM取决于你在事件处理程序中的实际操作。如果视图责任涵盖了它的逻辑,那就完全可以了。

  • 例如,PasswordBox密码属性不能为数据绑定,因为它不是DependencyProperty并且使用PasswordChanged eventhander来设置viewmodel属性是完全可以的。但是,如果您对服务器编写了密码验证,则会违反mvvm。

  • 我经常使用Loaded / Unloaded事件来调用VM上的Activate / Deactivate方法。当我经常使用它时,我创建了作为附加属性实现的行为,这对我来说是这样的,所以我不必多次在代码中重复相同的代码

  • 我经常在代码隐藏中使用DataGrid的事件,比如排序等。

  • 我使用TextBox.GotFocus事件来选择所有文本。同样,当我需要重用它时,我会创建行为。

  • 我使用codebehind来触发,或者如果它在xaml中过于复杂则创建动画。在这种情况下,我只是在xaml中为其他开发人员发表评论。

  • 在MVVM应用程序中,并非所有资产都必须使用MVVM严格编写。例如,我刚刚编写了我的ModalDialogWindow,我在其中注入了内容和按钮。我没有用于此控件的viewmodel,我从代码隐藏中做了所有事情。但是,我的应用程序具有可靠的MVVM架构,我使用IDialogService从我的页面视图模型中显示模态对话框。 ModalDialogWindow不会破坏我的应用程序的可测试性,可混合性或可读性,因为在测试中我无论如何都会模拟IDialogService并且我不需要测试ModalDialogWindow UI本身。