之前很长时间都在重复的敲着代码没有时间来学习技术充实自己,直到这个项目的代码已经乱到无法管理的时候,才想起来用MVVM的框架来构建系统。要使用MVVM,必然会涉及到前台控件中事件调用的问题,查了一些资料,大家都推荐的使用Icommand绑定到 控件的Command上。
但是这样会出现一个问题,就是不是所有的控件都有Command属性,只有继承ButtonBase的控件才带有Command属性。而且UI元素一般有Load ,MouseLeftButtonDown等情况,再这样情况下Icommand就不足以满足当前的项目需求。在微软社区经过询问之后一位外国友人推荐使用Behavior。 Blend中一共提供了包括CallMehod等在内的十三种行为,基本满足所有的需求。如有特殊情况可以进行对Action的扩展。
这篇文章是我用来记录我自己使用CallMethodAction的过程。首先看一下,微软对于CallMethodAction的解释: 您可以使用 CallMethodAction 操作来调用为指定对象定义的方法。所调用的方法必须是不采用参数并且不返回值的公共方法,或是其签名与事件处理程序的签名相匹配的公共方法。
微软帮助地址 http://msdn.microsoft.com/zh-cn/library/ff723947(v=expression.40).aspx。
顾名思义,CallMethodAction ,调用 方法的 “行为”。微软的解释中还有很重要的一点。 所调用的方法必须是不含参数的,并且不具备返回值的。
在Blend中行为里选择CallMethodAction将其拖拽到需要使用的控件之下。选中CallMethodAction。会发现几个属性。SourceName默认指向你拖拽到的控件。可以不绑定。EventName绑定到你需要调用该行为的事件之下,可以有Click,Load,MouseLeftButtonDown等等。MethodName( 可以手打)绑定到你的ViewModel中的需要调用的方法。 TargetObject一定要记住绑定。TargetObject绑定到 MethodName所在的地方,简单的说就是DataContext。MethodName的来源。
public void MapSwitchToVMethod()
{
ArcGISTiledMapServiceLayer TLayer = MyMap.Layers[0] as ArcGISTiledMapServiceLayer;
TLayer.Url = Application.Current.Resources["VectorLayer"].ToString();
}
ViewModel中的方法,不含参数,不含返回值。