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

在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并不错,因为两者之间的区别仅在于绑定命令或添加事件处理程序的地方。


你怎么看待这件事?


月关宝盒
浏览 939回答 3
3回答

UYOU

MVVM可以完全拆分代码和页面设计;程序员只关心编码,而设计师只关心设计。但:我从未见过任何使用Blend或了解XAML的设计师。几乎所有XAML都是由编码员自己编写的。

九州编程

代码隐藏没有本质上的坏处。对于简单的情况,拥有它很好。但是,在许多情况下,UI逻辑可能变得难以管理。将该逻辑封装在附加的行为和视图模型中,使我们能够隔离变量(并对其进行测试),从而更易于理解和维护。如果需要考虑可测试性,则可以在视图模型和附加行为中封装的UI逻辑越多,无需借助UI测试就可以验证的逻辑越多。(虽然它并不能完全消除对UI测试的需求,但它确实提供了进行UI测试之前的第一级验证,这将花费更多的时间/资源。
打开App,查看更多内容
随时随地看视频慕课网APP