導航:MVVMLight系列文章目錄:《關於 MVVMLight 設計模式系列》html
其實這也不屬於MVVMLight系列中的東東了,沒興趣的朋友能夠跳過這篇文章,本文主要介紹如何在WPF中實現將命令綁定到事件中。設計模式
上一篇中咱們介紹了MVVMLight中的命令的用法,那麼僅僅知道命令是如何構建使用的還不夠,不少狀況下咱們都須要在某個事件觸發的時候纔去觸發命令,因此將命令綁定到事件上是很是有效的作法,下面咱們來接着實現將命令綁定到事件中。函數
WPF實現命令綁定到事件
使用 System.Windows.Interactivity.dll
中的 Interaction
能夠幫助咱們實現對命令的綁定,因此咱們須要引用該文件到項目中,這個文件是微軟的Blend中提供的。(若是你在VS中 NuGet 了MVVMLight,那麼這個組件也會自動引用到項目中的) 若是你找不到該文件的話,我會在文章底部提供System.Windows.Interactivity.dll
文件的下載。spa
引用 System.Windows.Interactivity.dll
程序集以後,咱們在 View
中添加xmlns的引用以下:設計
- xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
這樣咱們就能夠在View中使用它了,我在 UserViewModel.cs 中編寫了一個 LoadDataCommand 的命令來加載數據。因此按照咱們以前所想作的就是在窗口 Loaded 加載完以後加載數據,咱們就將其命令綁定到 Loaded 事件中,代碼以下:code
- <!--讓Load事件觸發LoadDataCommand命令-->
- <i:Interaction.Triggers>
- <i:EventTrigger EventName="Loaded">
- <i:InvokeCommandAction Command="{Binding LoadDataCommand}" />
- </i:EventTrigger>
- </i:Interaction.Triggers>
將這段代碼放在<Window>標籤之中便可,同理若是你要在其餘元素中的事件進行綁定,那麼就放到其元素的標籤中便可。xml
關於如何編寫LoadDataCommand
呢,相信你看了上一篇文章,相信對你來講是很簡單的,不過我仍是把代碼貼出來方便你們吧 :)htm
下面是UserViewModel.cs的源碼
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- using GalaSoft.MvvmLight;
- using MyModel;
- using GalaSoft.MvvmLight.Command;
-
- namespace MVVMLightDemo.ViewModel
- {
- public class UserViewModel : ViewModelBase
- {
- /*********** 構造函數 ************/
- public UserViewModel()
- {
- //初始化數據
- //userData = User.GetUserList();
- _userData = new ObservableCollection<User>();
-
- //初始化命令 (第一個參數是執行的命令方法,第二個參數是控制命令是否可用)
- AddUserCommand = new RelayCommand(ExecuteAddUser, CanExecuteAddUser);
- DeleteUserCommand = new RelayCommand(ExecuteDeleteUser, CanExecuteDeleteUser);
- LoadDataCommand = new RelayCommand(ExecuteLoadDataCommand);
- }
-
- /************** 屬性 **************/
- private ObservableCollection<User> _userData;
- /// <summary>
- /// 用戶信息數據
- /// </summary>
- public ObservableCollection<User> UserData
- {
- get { return _userData; }
- set
- {
- _userData = value;
- RaisePropertyChanged("UserData");
- }
- }
-
-
- /************* 命令 ***************/
- #region 新增一個用戶命令:AddUserCommand
- /// <summary>
- /// 新增一個用戶
- /// </summary>
- public RelayCommand AddUserCommand { get; private set; }
-
- //新增一個用戶 命令執行方法
- void ExecuteAddUser()
- {
- User user = new User();
- user.ID = 3;
- user.Name = "王旭";
- user.Domain = "無/" + DateTime.Now.ToString();
- UserData.Add(user);
- }
-
- //小於5條數據時命令可用
- bool CanExecuteAddUser()
- {
- return UserData.Count < 5;
- }
- #endregion
-
- #region 刪除一個用戶命令:DeleteUserCommand
- /// <summary>
- /// 刪除一個用戶
- /// </summary>
- public RelayCommand DeleteUserCommand { get; private set; }
-
- //刪除一個用戶 命令執行方法
- void ExecuteDeleteUser()
- {
- UserData.RemoveAt(0);
- }
-
- //最少保證有1條數據時命令可用
- bool CanExecuteDeleteUser()
- {
- return UserData.Count > 1;
- }
- #endregion
-
- #region 加載數據命令:LoadDataCommand
- /// <summary>
- /// 加載數據
- /// </summary>
- public RelayCommand LoadDataCommand { get; private set; }
-
- //加載用戶數據
- void ExecuteLoadDataCommand()
- {
- UserData = User.GetUserList();
- }
- #endregion
- }
- }
-
這裏我編寫的LoadDataCommand
與以前寫的命令的區別就是,個人RelayCommand
只使用了一個參數,並無去作命令的可用性的判斷。進程
至此,就完成了事件綁定到命令中,很簡單吧!事件
改進程序,符合MVVM設計模式
你們還記得麼,咱們程序一共有兩個窗口,是經過MainWindow
中的一個Button
按鈕點擊來打開的UserView
窗口。是如何實現的?咱們在 MainWindow.cs
中編寫了Button
的Click
事件…顯然不符合MVVM的設計模式。
咱們下一篇則就是改進這個地方,而且是一個MVVMLight的很是有趣實用的技術點:消息通知。
有興趣的能夠返回目錄《關於 MVVMLight 設計模式系列》進入下一篇文章。
System.Windows.Interactivity.dll 文件下載:System.Windows.Interactivity
本文中的程序源碼下載:MVVMLightDemo_3
轉載請註明:王旭博客 » WPF 在事件中綁定命令