我们在进行wpf编程的时候为了更好的执行M V V M的编程模式。通常要把路由事件转换为command
但是通常情况下大多数wpf控件只有一个command属性用于绑定viewmodel中的命令
如button的click mouseenter mouseleave等路由事件怎么转化为command以调用viewmodel中的命令呢
通过下面的方法可以轻松的实现
1、首先要在项目里引入两个程序集
Microsoft.Practices.Prism.dll
System.Windows.Interactivity.dll
第一个程序集网上可以下到
第二个程序集通常装完vs后自带blend版本,那么该程序集就在这个blend版本下面
具体位置:C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Libraries\System.Windows.Interactivity.dll
2、xaml代码段的编写
首先要在xaml头部引入相应的名称空间
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
比如现在又这样一个需求要在gridcontrol loaded完后执行某个命令(viewmode里)
按照通常的路由事件的思路直接在.cs后台文件中写。但是为了更好的遵循mvvm的实现原则。我们使用另一种方法
<dxg:GridControl x:name="testGC">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding LoadedCommand}" CommandParameter="{Binding ElementName=testGC}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</dxg:GridControl>
红色部分是关键代码在调用命令的时候还可以传入参数
3、viewmodel中的被调用的命令形式(viewmodel.cs)
private ICommand loadedCommand;
public ICommand LoadedCommand
{
get { return loadedCommand; }
}
定义一个命令属性已把后台命令暴露给前端xaml。
下面我们定义一个命令要执行的方法
private void GridcontrolLoaded(GridControl gc)
{
//todo
}
最后在类构造函数中 把命令和方法关联起来
loadedCommand= new DelegateCommand<GridControl>(GridcontrolLoaded);
注意DelegateCommand要引入Microsoft.Practices.Prism.Commands名称空间
至此整个过程已经完成、若有疑问或建议欢迎提问探讨。