WPF自學入門(十一)WPF MVVM模式Command命令

        在WPF自學入門(十)WPF MVVM簡單介紹中的示例彷佛運行起來沒有什麼問題,也能夠進行更新。可是這並非咱們使用MVVM的正確方式。正如上一篇文章中在開始說的,MVVM的目的是爲了最大限度地下降了Xaml文件和CS文件的耦合度,分離界面和業務邏輯,因此咱們要儘量的在View後臺不寫代碼。可是這個例子中,咱們將更新ViewModel的代碼寫在了View裏,下一個例子中,咱們要經過命令(Command)的來將Button的事件分離出來。框架

       由於本文中須要使用Command命令,咱們先來簡單瞭解Command命令。在WPF中使用命令的步驟很簡單函數

1.建立命令this

2.綁定命令spa

3.設置命令源3d

4.設置命令目標code

      WPF中命令的核心是System.Windows.Input.ICommand接口,全部命令對象都實現了此接口。當建立本身的命令時,不能直接實現ICommand接口,而是要使用System.Windows.Input.RouteCommand類,該類已經實現了ICommand接口,全部WPF命令都是RouteCommand類的實例。在程序中處理的大部分命令不是RoutedCommand對象,而是RoutedUICommand類的實例,它繼承自RouteCommand類。對象

       WPF提供了一個很好的方式來解決事件綁定的問題--ICommand。不少控件都有Command屬性,若是沒有,咱們能夠將命令綁定到觸發器上。接下來咱們來先實現一個ICommand接口。ICommand須要用戶定義兩個方法bool CanExecute和void Execute。第一個方法可讓咱們來判斷是否能夠執行這個命令,第二個方法就是咱們具體的命令。blog

 1 using System;  2 
 3 using System.Collections.Generic;  4 
 5 using System.Linq;  6 
 7 using System.Text;  8 
 9 using System.Windows.Input;  10 
 11  
 12 
 13 /***********************做者:黃昏前黎明後**********************************  14 
 15 * 做者:黃昏前黎明後  16 
 17 * CLR版本:4.0.30319.42000  18 
 19 * 建立時間:2018-04-05 22:57:56  20 
 21 * 命名空間:Example3  22 
 23 * 惟一標識:b9043d4c-fdd7-4e0f-a324-00f0f09286d0  24 
 25 * 機器名稱:HLPC  26 
 27 * 聯繫人郵箱:hl@cn-bi.com  28 
 29 *  30 
 31 * 描述說明:  32 
 33 *  34 
 35 * 修改歷史:  36 
 37 *  38 
 39 *  40 
 41 *****************************************************************/
 42 
 43 namespace Example3  44 
 45 {  46 
 47     public class RelayCommand : ICommand  48 
 49  {  50 
 51         #region 字段
 52 
 53         readonly Func<Boolean> _canExecute;  54 
 55         readonly Action _execute;  56 
 57         #endregion
 58 
 59  
 60 
 61         #region 構造函數
 62 
 63         public RelayCommand(Action execute)  64 
 65             : this(execute, null)  66 
 67  {  68 
 69  }  70 
 71         public RelayCommand(Action execute, Func<Boolean> canExecute)  72 
 73  {  74 
 75             if (execute == null)  76 
 77                 throw new ArgumentNullException("execute");  78 
 79             _execute = execute;  80 
 81             _canExecute = canExecute;  82 
 83  }  84 
 85         #endregion
 86 
 87  
 88 
 89         #region ICommand的成員
 90 
 91         public event EventHandler CanExecuteChanged  92 
 93  {  94 
 95  add  96 
 97  {  98 
 99  
100 
101                 if (_canExecute != null) 102 
103                     CommandManager.RequerySuggested += value; 104 
105  } 106 
107  remove 108 
109  { 110 
111  
112 
113                 if (_canExecute != null) 114 
115                     CommandManager.RequerySuggested -= value; 116 
117  } 118 
119  } 120 
121  
122 
123  [DebuggerStepThrough] 124 
125         public Boolean CanExecute(Object parameter) 126 
127  { 128 
129             return _canExecute == null ? true : _canExecute(); 130 
131  } 132 
133  
134 
135         public void Execute(Object parameter) 136 
137  { 138 
139  _execute(); 140 
141  } 142 
143         #endregion
144 
145  } 146 
147 } 148 
149

 

咱們再在咱們的NameViewModel中聲明一個ICommand字段:繼承

  

 1 #region 命令
 2 
 3         void UpdateNameExecute()  4 
 5  {  6 
 7             this.UserName = "黃昏前黎明後";  8 
 9             this.CompanyName = "中軟易通科技"; 10 
11  } 12 
13  
14 
15         bool CanUpdateNameExecute() 16 
17  { 18 
19             return true; 20 
21  } 22 
23  
24 
25         public ICommand UpdateName { get { return new RelayCommand(UpdateNameExecute, CanUpdateNameExecute); } } 26 
27  
28 
29         #endregion

 

 

最後,咱們再將事件綁定上這個Command:接口

<Button Content="更新" Command="{Binding UpdateName}" Margin="20"/>

運行一下,看結果。咱們成功將事件分離了出來。

 

     看到上面的結果,彷佛目前爲止咱們已經很好的解決了全部的問題。咱們看到運行的數據,事件都是綁定的,實現了界面的完美分離。實際在處理問題是好像須要考慮通用性,這時咱們可否把MVVM提取出來做爲一個框架,來去更好的解決問題。下一次咱們一塊兒來看看怎麼進行提取成爲通用框架。

 

本文的DEMO下載地址:WPFMVVMDemo2.zip

相關文章
相關標籤/搜索