MVVM ICommand替代方案

Jos*_*ose 3 wpf mvvm viewmodel

我已经开始创建一个wpf mvvm应用程序.它似乎是ViewModel的一个重要组成部分,它是一组ICommands,它具有允许视图与视图模型交互的松散耦合方式.

我的问题是,为什么我不能直接绑定到方法?

我使用了Josh Smith的ICommand的RelayCommand实现,它允许你将delgates注入ICommand对象,但实际上,是否有一些更容易的方法允许按钮推送来调用viewmodel中的方法?

我是MVVM的新手,我相信我需要一些启发

Ken*_*art 7

您不能直接绑定到方法,因为Button(例如)没有接受委托的属性.相反,它具有Command类型的属性ICommand.A RelayCommand(又名DelegateCommand)只是一个ICommand包装代表的人.

我没有看到为什么视图无法通过标记扩展来绑定视图模型上的特定方法的技术原因:

<Button Command="{ViewModelMethod SomeMethodName}"/>
Run Code Online (Sandbox Code Playgroud)

但是,这会更慢并且会增加视图和视图模型之间的耦合.如果视图仅知道视图模型类型上的属性ICommand,则该命令的实现可以完全更改(或者可以重命名方法),而视图不会被识别.


Ole*_*lik 6

我完全不同意.

调用的速度没有相关性:命令是用户交互,它们从不需要速度.

关于耦合的争论也是有缺陷的.为什么{Binding MyProperty}不是耦合但{ViewMethod MyMethod}是?

将特制的"命令"包裹在方法中的要求是一个愚蠢的要求.命令在封面下可能是有用的实现,但是我们已经在C#中使用了一些方法,并用大而笨重的东西替换它们是不对的.

关于MarkupExtension和Binding的事情,真的很难.但这是可以完成的.实际上,它已经完成,您可以查看CodePlex上的MethodCall项目:http: //methodcallthing.codeplex.com/

您可以使用绑定为方法选择"this",并可以使用绑定来获取参数.所有这些都是实时的,即在调用命令时计算.另一个奖励功能是方法调用的推出结果,你也可以使用绑定(OneWayToSource).


小智 5

ICommand为您提供了CanExecute,这是控制启用所必需的.一个简单的代表不会.ICommand是要走的路.