Prism中如何實現一般路由事件的綁定
用過一段時間的Prism4了,剛開始很不習慣,現在感覺這種松耦合機制是有它的道理。現在便是想整理一些東西出來,方便記憶吧。我們在實現MVVM模式的時候,前臺View和后臺ViewModel的交互就是通過綁定來實現的,其中控件觸發事件的綁定有幾種情況:
第一種,控件繼承自ButtonBase、MenuItem類,比如:Button、RadioButton、Hyperlink、MenuItem……這種情況下,由于Prism已經幫我們實現了這些控件的Command屬性,可以直接綁定Command屬性來完成Click事件到ViewModel的綁定:
- <Button Content="確認" Command="{Binding LoginCommand}" />
LoginCommand便是ViewModel中的事件處理程序入口,它是一個實現了ICommand接口的命令:
- private DelegateCommand<object> _loginCommand;
- public ICommand LoginCommand
- {
- get
- {
- if(_loginCommand ==null)
- _loginCommand = new DelegateCommand<object>(OnLogin);
- return _loginCommand;
- }
- }
- private void OnLogin(object obj)
- {
- // 這里定義要做的動作
- }
這些控件除了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"的命名空間引用,這樣就可以使用了:
- <TreeView Name="TV_Test"ItemsSource="{Binding TreeViewSource}" >
- <i:Interaction.Triggers>
- <i:EventTrigger EventName="SelectedItemChanged">
- <i:InvokeCommandAction Command="{Binding SelectedChangedCommand}" CommandParameter="{Binding ElementName=TV_Test}"/>
- </i:EventTrigger>
- </i:Interaction.Triggers>
- </TreeView>
其中,“EventName”屬性指定了響應的事件的全稱,它可以為該控件所有的事件。CommandParameter傳遞參數,這個是一個可選屬性,參數可以是字符串、或者是綁定的其它內容。后臺的ViewModel與第一種情況一樣:
- private DelegateCommand<TreeView> _selectedChangedCommand;
- public ICommand SelectedChangedCommand
- {
- get {
- return _selectedChangedCommand ??
- (_selectedChangedCommand = new DelegateCommand<TreeView>(SelectedChangedCommandExcute));
- }
- }
- private void SelectedChangedCommandExcute(TreeView sender)
- {
- // 要做的動作
- }
Prism是個非常強大的東東,它使用依賴注入,控制反轉容器來幫助我們解決團隊合作的松耦合問題,當框架定好后,開發和修改都有非常好的可操作性,未來我還會花時間繼續學習Prsim。
附上DLL下載:System.Windows.Interactivity
原文鏈接:http://www.cnblogs.com/lekko/archive/2012/07/25/2608143.html