我已经开始创建一个wpf mvvm应用程序。似乎viewmodel的一个重要组成部分是一堆ICommands,以一种松散耦合的方式允许视图与视图模型交互。
我的问题是,为什么我不能直接绑定到一个方法?
我已经使用了Josh Smith的ICommand的RelayCommand实现,它允许您将delgate注入到ICommand对象中,但实际上,有没有更简单的方法来允许按下按钮来调用视图模型中的方法?
我是MVVM的新手,我相信我需要一些启发
发布于 2009-05-29 15:48:23
您不能直接绑定到方法,因为Button (例如)没有接受委托的属性。相反,它有一个ICommand类型的Command属性。RelayCommand (也称为DelegateCommand)只是一个包装委托的ICommand。
我不知道为什么视图不能通过标记扩展绑定到视图模型上的特定方法:
<Button Command="{ViewModelMethod SomeMethodName}"/>但是,这样做会更慢,并且会增加视图和视图模型之间的耦合。如果视图只知道ICommand类型的视图模型上的属性,则该命令的实现可能会在视图不知道的情况下完全更改(或者重命名方法)。
发布于 2009-07-19 00:59:27
我完全不同意。
调用的速度与此无关:命令是用户交互,它们从不要求速度。
关于耦合的争论也是有缺陷的。为什么{Binding MyProperty}没有耦合,而{ViewMethod MyMethod}是耦合?
要求有专门制作的“命令”来包装方法是一个愚蠢的要求。命令在幕后可能是有用的实现,但我们在C#中已经有了方法,用大而笨重的东西替换它们是不正确的。
关于MarkupExtension和绑定,这真的很难。但这是可以做到的。实际上,它已经完成了,您可以在CodePlex上查看MethodCall项目:http://methodcallthing.codeplex.com/
您可以使用绑定为方法选择'this‘,也可以使用绑定来获取参数。并且所有这些都是实时的,即在调用命令时被计算。另一个额外的特性是方法调用的推送结果,你也可以使用绑定(OneWayToSource)。
发布于 2009-09-02 23:47:24
ICommand会为您提供开启控件所需的CanExecute。简单的委托不需要。ICommand是最好的选择。
https://stackoverflow.com/questions/926622
复制相似问题