为了账号安全,请及时绑定邮箱和手机立即绑定

为什么要避免WPF MVVM模式中的代码隐藏?

为什么要避免WPF MVVM模式中的代码隐藏?

月关宝盒 2019-11-13 09:24:45
在Josh Smith 的文章“ 具有Model-View-ViewModel设计模式的WPF应用程序”中,作者说:(1)在设计良好的MVVM架构中,大多数视图的背后代码应为空,或者最多只能包含操纵该视图中包含的控件和资源的代码。(2)有时也有必要在与ViewModel对象进行交互的View的代码隐藏中编写代码,例如,钩住事件或调用否则很难从ViewModel本身调用的方法。我的问题是,如下所示,为什么这样的方法AttachedCommandBehavior或InvokeCommandAction试图避免编码背后的编码。让我解释更多细节。就(1)而言,我认为与AttachedCommandBehavior中的以下情况类似。为界没有实现ICommandSource的MouseRightButtonDown,你不能经常绑定的事件和ICommand,但可以用做AttachedCommandBehavior。<!-- I modified some code from the AttachedCommandBehavior to show more simply --><Border>    <local:CommandBehaviorCollection.Behaviors>           <local:BehaviorBinding Event="MouseRightButtonDown"                   Command="{Binding SomeCommand}"                   CommandParameter="A Command on MouseRightButtonDown"/>    </local:CommandBehaviorCollection.Behaviors></Border>要么我们可以使用System.Windows.Interactivity.InvokeCommandAction。<Border xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" >    <i:Interaction.Triggers>        <i:EventTrigger EventName="MouseRightButtonDown">            <i:InvokeCommandAction Command="{Binding SomeCommand}"                CommandParameter="A Command on MouseRightButtonDown"/>        </i:EventTrigger>    </i:Interaction.Triggers></Border>但,我们使用下面的XAML及其代码背后的Border_MouseRightButtonDown方法,该方法链接到上述(2)Josh Simth。<Border MouseRightButtonDown ="Border_MouseRightButtonDown"/>我认为使用上面的codebehind并不错,因为两者之间的区别仅在于绑定命令或添加事件处理程序的地方。你怎么看待这件事?
查看完整描述

3 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

MVVM可以完全拆分代码和页面设计;程序员只关心编码,而设计师只关心设计。但:

  1. 我从未见过任何使用Blend或了解XAML的设计师。

  2. 几乎所有XAML都是由编码员自己编写的。


查看完整回答
反对 回复 2019-11-13
?
九州编程

TA贡献1785条经验 获得超4个赞

代码隐藏没有本质上的坏处。对于简单的情况,拥有它很好。但是,在许多情况下,UI逻辑可能变得难以管理。将该逻辑封装在附加的行为和视图模型中,使我们能够隔离变量(并对其进行测试),从而更易于理解和维护。

如果需要考虑可测试性,则可以在视图模型和附加行为中封装的UI逻辑越多,无需借助UI测试就可以验证的逻辑越多。(虽然它并不能完全消除对UI测试的需求,但它确实提供了进行UI测试之前的第一级验证,这将花费更多的时间/资源。


查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 934 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信