(1) 在一个良好设计的MVVM架构中,大多数View的codebehind应该是空的,或者最多只包含操作该View内的控件和资源的代码。(2) 有时也需要在View的codebehind中编写与ViewModel对象交互的代码,例如挂接事件或调用从ViewModel本身很难调用的方法。
我的问题是,在(1)处,为什么空的codebehind被视为良好设计的MVVM。(听起来空的codebehind总是好的。)
编辑:我的问题是,为什么要避免像AttachedCommandBehavior或InvokeCommandAction这样的方法来避免codebehind编码。
让我解释得更详细一些。
就(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 Smith所说的内容。
<Border MouseRightButtonDown ="Border_MouseRightButtonDown"/>
我认为使用上述的codebehind并不差,因为它们之间的区别仅在于绑定命令或添加事件处理程序的位置。
您对此有何看法?