Prism中如何实现一般路由事件的绑定

开发 后端
用过一段时间的Prism4了,刚开始很不习惯,现在感觉这种松耦合机制是有它的道理。现在便是想整理一些东西出来,方便记忆吧。

用过一段时间的Prism4了,刚开始很不习惯,现在感觉这种松耦合机制是有它的道理。现在便是想整理一些东西出来,方便记忆吧。我们在实现MVVM模式的时候,前台View和后台ViewModel的交互就是通过绑定来实现的,其中控件触发事件的绑定有几种情况: 

第一种,控件继承自ButtonBase、MenuItem类,比如:Button、RadioButton、Hyperlink、MenuItem……这种情况下,由于Prism已经帮我们实现了这些控件的Command属性,可以直接绑定Command属性来完成Click事件到ViewModel的绑定:

  1. <Button Content="确认" Command="{Binding LoginCommand}" /> 

LoginCommand便是ViewModel中的事件处理程序入口,它是一个实现了ICommand接口的命令:

  1. private DelegateCommand<object> _loginCommand;  
  2. public ICommand LoginCommand  
  3. {  
  4.     get 
  5.     {  
  6.         if(_loginCommand ==null)  
  7.             _loginCommand = new DelegateCommand<object>(OnLogin);  
  8.         return _loginCommand;  
  9.     }  
  10. }  
  11. private void OnLogin(object obj)  
  12. {  
  13.     // 这里定义要做的动作  

这些控件除了Command属性外还可定义参数属性CommandParameter,用来传递参数给处理函数。

 

第二种,不属于第一种类型的控件,比如,ListView、ListBox、DropDownList等等大部分没有Click事件的控件。这时候,当我们要实现SelectedItemChanged、SelectionChanged等常用事件的时候,需要通过继承CommandBehaviorBase<T>来自己定义这些事件,具体做法比较麻烦,有兴趣的朋友可以去看Prism的帮助文档,在第六章“Extending Prism Command Behaviors”这一节有讲述。

另外,有一种更方便的方法来实现这些操作,那便是使用Expression Blend附带的System.Windows.Interactivity.dll文件,它使用interaction trigger和InvokeCommandAction behavior来帮助我们直接绑定控件的事件。要使用这个DLL,当然先是在项目中引入dll文件,这个文件在安装完Blend4后会出现在:

C:\Program Files\Microsoft SDKs\Expression\Blend\.NETFramework\v4.0\Libraries\System.Windows.Interactivity.dll

需要注意的是,如果你的View、ViewModel不在启动项目中,记得在启动项目中也引用这个dll文件,不然会发生找不到程序集的错误。接下来在前台View中加入xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"的命名空间引用,这样就可以使用了:

  1. <TreeView Name="TV_Test"ItemsSource="{Binding TreeViewSource}" >  
  2.      <i:Interaction.Triggers>  
  3.          <i:EventTrigger EventName="SelectedItemChanged">  
  4.              <i:InvokeCommandAction Command="{Binding SelectedChangedCommand}" CommandParameter="{Binding ElementName=TV_Test}"/>  
  5.          </i:EventTrigger>  
  6.      </i:Interaction.Triggers>  
  7.  </TreeView> 

其中,“EventName”属性指定了响应的事件的全称,它可以为该控件所有的事件。CommandParameter传递参数,这个是一个可选属性,参数可以是字符串、或者是绑定的其它内容。后台的ViewModel与第一种情况一样:

  1. private DelegateCommand<TreeView> _selectedChangedCommand;  
  2.  public ICommand SelectedChangedCommand  
  3.  {  
  4.      get {  
  5.          return _selectedChangedCommand ??  
  6.                      (_selectedChangedCommand = new DelegateCommand<TreeView>(SelectedChangedCommandExcute));  
  7.      }  
  8.  }  
  9.  private void SelectedChangedCommandExcute(TreeView sender)  
  10.  {  
  11.      // 要做的动作  
  12.  } 

Prism是个非常强大的东东,它使用依赖注入,控制反转容器来帮助我们解决团队合作的松耦合问题,当框架定好后,开发和修改都有非常好的可操作性,未来我还会花时间继续学习Prsim。

附上DLL下载:System.Windows.Interactivity

原文链接:http://www.cnblogs.com/lekko/archive/2012/07/25/2608143.html

责任编辑:林师授 来源: 博客园
相关推荐

2010-10-08 14:23:08

MySQL中INSER

2009-12-16 10:52:47

PSP无线路由设置

2009-12-22 15:25:23

2009-12-16 15:56:05

Cisco路由器配置

2020-06-09 08:09:07

机器学习统计学习无监督学习

2017-08-31 14:09:26

数据库MySQLSQL优化

2011-09-08 11:35:18

2015-06-24 10:01:47

2010-01-06 13:32:27

JSON数据

2009-08-24 12:58:15

C# 泛型约束

2010-09-14 10:55:14

DIV CSS网页制作

2019-06-05 15:23:09

Redis缓存存储

2012-06-27 09:29:49

程序员

2021-08-16 08:42:31

MySQL查询数据库

2021-08-19 09:16:29

MySQL数据库优化器

2018-01-08 15:07:15

java项目后台

2023-07-27 08:34:57

软件迭代管理

2022-04-02 15:08:54

API调试

2011-04-06 16:41:25

LCPPPPIPCP

2017-12-22 22:55:29

弱电工程综合布线布线
点赞
收藏

51CTO技术栈公众号