相关疑难解决方法(0)

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

在文章中,使用Model-View-ViewModel设计模式的WPF应用程序,Josh Smith的作者说:

(1)在设计良好的MVVM体系结构中,大多数视图的代码隐藏应该是空的,或者最多只包含操作该视图中包含的控件和资源的代码.(2)有时还需要在与ViewModel对象交互的View的代码隐藏中编写代码,例如挂钩事件或调用一个本来很难从ViewModel本身调用的方法.

我的问题是,在(1),为什么空代码被认为是一个设计良好的MVVM.(听起来空的代码隐藏总是很好.)

编辑:我的问题是,如下,为什么像的方法AttachedCommandBehavior或者InvokeCommandAction是试图避免代码隐藏编码.

让我解释一下细节.

就(1)而言,我会认为以下情况来自AttachedCommandBehavior.由于Border没有实现ICommandSourcefor 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>
Run Code Online (Sandbox Code Playgroud)

要么

我们可以这样做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>
Run Code Online (Sandbox Code Playgroud)

但,

我们使用以下XAML及其代码隐藏Border_MouseRightButtonDown方法,该方法与上述(2)Josh Simth相关联.

<Border MouseRightButtonDown ="Border_MouseRightButtonDown"/>
Run Code Online (Sandbox Code Playgroud)

我认为使用上面的代码隐藏并不坏,只是因为它们之间的区别只是绑定命令或添加事件处理程序.

你怎么看待这件事?

xaml code-behind mvvm

47
推荐指数
3
解决办法
3万
查看次数

标签 统计

code-behind ×1

mvvm ×1

xaml ×1