成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解WP開發(fā)中MVVM模式的綁定功能

移動開發(fā)
MVVM和MVC、MVP一樣都是為了分離呈現(xiàn)和業(yè)務(wù)為目標(biāo)的設(shè)計(jì)模式,MVVM使用了WPF系列庫特有的綁定機(jī)制從視圖層移除絕大部分的業(yè)務(wù)處理和業(yè)務(wù)數(shù)據(jù)提供的邏輯。于獨(dú)立的視圖模型層更有利于測試。

MVVM這個模式在WPF和Silverlight開發(fā)中已經(jīng)非常流行了,因?yàn)閃P7的應(yīng)用開發(fā)也是Silverlight的,MVVM的一樣可以適用。雖然MVVM有不少明確的定義,但是我也沒有找到比較統(tǒng)一的來描述它,所以大概說一下我的總結(jié):

MVVM和MVC、MVP一樣都是為了分離呈現(xiàn)和業(yè)務(wù)為目標(biāo)的設(shè)計(jì)模式,MVVM使用了WPF系列庫特有的綁定機(jī)制從視圖層移除絕大部分的業(yè)務(wù)處理和業(yè)務(wù)數(shù)據(jù)提供的邏輯。于獨(dú)立的視圖模型層更有利于測試。

大概結(jié)構(gòu)如下:

MVVM結(jié)構(gòu)

View更關(guān)注界面的呈現(xiàn),ViewModel更關(guān)注業(yè)務(wù)處理,Model作為之間交互的模型數(shù)據(jù)。

MVVM的綁定Binding

WPF和Silverlight提供了強(qiáng)大的綁定功能,為MVVM提供了必要的基礎(chǔ):

1.數(shù)據(jù)來源

在使用綁定之前,需要有基礎(chǔ)的數(shù)據(jù)的來源,如CLR對象和XML形式,在MVVM里就應(yīng)該這個View視圖對于的ViewModel視圖模型。將ViewModel對象設(shè)定到視圖根元素的FrameworkElement. DataContext屬性上完成數(shù)據(jù)來源的設(shè)置,根元素一般就是phone:PhoneApplicationPage。

代碼很簡單:

  1. public partial class MainPageView  
  2. {  
  3.         // 構(gòu)造函數(shù)  
  4.         public MainPageView()  
  5.         {  
  6.             InitializeComponent();  
  7.             DataContext = new MainPageViewModel();  
  8.         }  

2.數(shù)據(jù)綁定

數(shù)據(jù)綁定是在應(yīng)用程序 UI 與業(yè)務(wù)邏輯之間建立連接的過程。如果綁定具有正確設(shè)置并且數(shù)據(jù)提供正確通知,則當(dāng)數(shù)據(jù)更改其值時,綁定到數(shù)據(jù)的元素會自動反映更改。

數(shù)據(jù)綁定

在MVVM里,簡單的說就是能夠讓視圖View和視圖模型ViewModel的數(shù)據(jù)能夠動態(tài)同步更新,并且支持更新的方法。實(shí)現(xiàn)同步更新需要讓ViewModel實(shí)現(xiàn)INotifyPropertyChanged接口。

  1. public interface INotifyPropertyChanged    
  2. {          
  3.         //在更改屬性值時發(fā)生。          
  4.  event PropertyChangedEventHandler PropertyChanged;   
  5. }  
  6.  
  7. PropertyChangedEventArgs的定義如下:  
  8.  
  9. public class PropertyChangedEventArgs : EventArgs  
  10. {  
  11.         // propertyName: 已更改的屬性的名稱。  
  12.         public PropertyChangedEventArgs(string propertyName);  
  13.  
  14.         public string PropertyName { get; }  

只需要在ViewModel的屬性更新時觸發(fā)PropertyChanged并傳入更改的屬性名稱就可以了。

完整示例:

  1. public class DemoCustomer  : INotifyPropertyChanged  
  2. {  
  3.       
  4.     public event PropertyChangedEventHandler PropertyChanged;  
  5.  
  6.     private void NotifyPropertyChanged(String info)  
  7.     {  
  8.         if (PropertyChanged != null)  
  9.         {  
  10.             PropertyChanged(this, new PropertyChangedEventArgs(info));  
  11.         }  
  12.     }  
  13.      
  14.  
  15.     public string CustomerName  
  16.     {  
  17.         get  
  18.         {  
  19.             return this.customerNameValue;  
  20.         }  
  21.  
  22.         set  
  23.         {  
  24.             if (value != this.customerNameValue)  
  25.             {  
  26.                 this.customerNameValue = value;  
  27.                 NotifyPropertyChanged("CustomerName");  
  28.             }  
  29.         }  
  30.     }  

在XAML里面添加下面的代碼就可以實(shí)現(xiàn)數(shù)據(jù)綁定。

  1. <TextBox Text="{Binding Path=CustomerName, Mode=TwoWay}" /> 

這樣在界面修改TextBox 或 后臺程序修改CustomerName的時候都可以同步更新(內(nèi)部還解決線程切換的問題)數(shù)據(jù)綁定可以方便的同步View和ViewModel,并很好的減少了耦合。

3.命令綁定

命令是WPF中的輸入機(jī)制,它提供的輸入處理比設(shè)備輸入具有更高的語義級別。例如,在許多應(yīng)用程序中都能找到的“復(fù)制”、 “剪切”和 “粘貼”操作就是命令。

命令支持自定義命令,實(shí)現(xiàn)自定義命令需要實(shí)現(xiàn)ICommand接口。

  1. public interface ICommand  
  2. {  
  3.          //     當(dāng)出現(xiàn)影響是否應(yīng)執(zhí)行該命令的更改時發(fā)生。  
  4.         event EventHandler CanExecuteChanged;  
  5.  
  6.         //     定義用于確定此命令是否可以在其當(dāng)前狀態(tài)下執(zhí)行的方法。  
  7.           bool CanExecute(object parameter);  
  8.          
  9.         //     定義在調(diào)用此命令時調(diào)用的方法。  
  10.            void Execute(object parameter);  

自定義命令是MVVM命令綁定的基礎(chǔ)。實(shí)現(xiàn)一個最簡單的自定義Command,暫時無視CanExecuteChanged變更和傳入?yún)?shù)。

  1. public class InvokeCommand : ICommand  
  2. {  
  3.         private readonly Action action;  
  4.         public event EventHandler CanExecuteChanged;  
  5.           
  6.         public InvokeCommand(Action action)  
  7.         {  
  8.             this.action = action;  
  9.         }  
  10.  
  11.         public bool CanExecute(object parameter)  
  12.         {  
  13.             return true;  
  14.         }  
  15.           
  16.         public void Execute(object parameter)  
  17.         {  
  18.             action();  
  19.         }  

在ViewModel里面添加屬性:

  1. public ICommand HelloCommand{ get; set; }  

ViewModel構(gòu)造函數(shù)內(nèi)添加:

  1. HelloCommand = new InvokeCommand(() => MessageBox.Show(“Hello world”)); 

在ButtonBase類里面有一個 Command屬性,獲取或設(shè)置當(dāng)按此按鈕時要調(diào)用的命令。

  1. <button command="{Binding HelloCommand}" /> 

這樣點(diǎn)擊button就會觸發(fā)MessageBox.Show(“Hello world”)); 命令綁定提供了簡單的機(jī)制,讓業(yè)務(wù)處理的消息可以在ViewModel里執(zhí)行。

4.擴(kuò)展命令綁定為動作綁定(事件綁定)

命令綁定僅僅提供了ButtonBase的點(diǎn)擊事件,要是有更復(fù)雜的事件需要使用到動作綁定,這個基礎(chǔ)是由System.Windows.Interactivity提供的,在C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\Windows Phone\v7.1\Libraries里面可以找到。

另外動作綁定并沒有正式的名稱,我只是為了統(tǒng)一隨口叫的。動作綁定就稍微復(fù)雜一點(diǎn),首先我們需要實(shí)現(xiàn)一個自定義的動作,繼承TriggerAction實(shí)現(xiàn)自己的InvokeAction。

  1. public class InvokeAction:TriggerAction<FrameworkElement> 
  2. {  
  3.         public static readonly DependencyProperty CommandProperty 
  4.             = DependencyProperty.Register("Command", typeof (ICommand), typeof (InvokeAction));  
  5.  
  6.         public ICommand Command  
  7.         {  
  8.             get { return (ICommand) GetValue(CommandProperty); }  
  9.             set { SetCurrentValue(CommandProperty, value); }  
  10.         }  
  11.         protected override void Invoke(object parameter)  
  12.         {  
  13.             ICommand command = Command;  
  14.             if (command  == null)return;  
  15.             if (!command.CanExecute(parameter)) return;  
  16.  
  17.             command.Execute(parameter);  
  18.         }  

里面定義了一個Command的依賴屬性,用法和ButtonBase一樣,這樣就可以方便綁定命令了。

XAML代碼如下:

首先引用System.Windows.Interactivity添加命名空間:xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

  1. <Button Content="Button"> 
  2.         <i:Interaction.Triggers> 
  3.                 <i:EventTrigger EventName="Click"> 
  4.                     <local:InvokeAction Command="{Binding HelloCommand}" /> 
  5.                 </i:EventTrigger> 
  6.          </i:Interaction.Triggers> 
  7. </Button> 

i:EventTrigger的EventName可以設(shè)置該控件上的各種事件,這里為了方便還是用的點(diǎn)擊Clicklocal:InvokeAction將自定義動作InvokeAction元素添加進(jìn)去,還是繼續(xù)使用上一節(jié)定義的HelloCommand,同樣點(diǎn)擊Button 之后Hello World就顯示出來了。當(dāng)然使用i:InvokeCommandAction 更方便,我只是演示一下。

原文鏈接:http://www.cnblogs.com/kiminozo/archive/2012/01/27/2330112.html

責(zé)任編輯:王曉東 來源: 博客
相關(guān)推薦

2012-05-11 09:38:00

MVVM Light

2021-01-21 05:50:28

MVVM模式Wpf

2013-07-31 13:13:50

Windows PhoMVVM模式

2017-07-17 15:19:10

MVVM模式iOS開發(fā)MVP

2012-05-19 22:24:34

MVVM

2014-10-11 10:41:44

Windows Pho

2016-10-11 20:33:17

JavaScriptThisWeb

2013-02-25 11:06:34

2010-04-23 13:23:42

Silverlight

2009-07-24 13:54:39

MVVM模式

2009-12-21 09:22:51

SilverlightMVVM模式

2012-04-05 11:35:07

.NET

2012-08-17 09:07:51

Office 2013Word 2013

2012-05-25 12:57:31

Windows Pho

2010-01-21 09:08:53

.NET設(shè)計(jì)模式

2009-06-30 15:18:10

StringBuildJava

2009-07-15 10:52:13

JTree組件

2009-10-26 15:07:12

checkbox樹

2010-06-29 14:33:36

UML面向?qū)ο蠼?/a>

2023-07-03 07:39:43

Spring框架設(shè)計(jì)模式
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩中文字幕一区 | 91精品国产综合久久婷婷香蕉 | 日韩精品av一区二区三区 | 人操人人 | 综合久久亚洲 | 成人免费在线 | 亚洲a网| a级片在线观看 | 亚洲欧美日韩中文字幕一区二区三区 | 欧美视频一区二区三区 | 久久成人精品视频 | 国产精品一区二区av | 日韩影音| 免费在线观看一级毛片 | 美女黄网 | 男女午夜激情视频 | 国产日韩精品在线 | 91中文在线观看 | www.色综合 | 精品www| 97视频网站 | 国产a级黄色录像 | 中文字幕亚洲精品 | 国产精品美女久久久久aⅴ国产馆 | 中文字幕在线一区 | 精品九九九 | 天天躁日日躁狠狠躁白人 | 国产激情精品视频 | 国产美女自拍视频 | 日韩一区二区在线视频 | 中文字幕一区二区三区日韩精品 | 羞羞的视频在线观看 | 一区二区免费在线观看 | 伊人免费在线观看 | 妞干网av| 久久99精品久久久久子伦 | 99精品在线观看 | 久久久激情视频 | 国产精品久久久久久久久久久免费看 | 台湾佬久久 | 国产精品久久久久久久久久 |