午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

MVVM中輕松實(shí)現(xiàn)Command綁定(五)獲取事件參數(shù)EventArgs(2)

 TT_TYG 2013-04-28

MVVM中輕松實(shí)現(xiàn)Command綁定(五)獲取事件參數(shù)EventArgs(2)

分類: C# WPF Command EventArgs ViewModel MVVM 4375人閱讀 評論(9) 收藏 舉報(bào)

在上一節(jié)中我介紹了“MVVM中輕松實(shí)現(xiàn)Command綁定(四)獲取事件參數(shù)EventArgs”,通過Loaded事件傳遞控件對象,然后添加事件方法,這樣做是可以的,但是不符合MVVM的思想,今日我介紹另一種方法,通過擴(kuò)展interactivity的InvokeCommandAction來實(shí)現(xiàn)事件參數(shù)傳遞。

先來看普通的InvokeCommandAction方式

  1. <Window x:Class="EventArgsInViewModel.MainWindow"  
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  4.         xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"  
  5.         xmlns:loc="clr-namespace:EventArgsInViewModel"  
  6.         Title="MainWindow" Height="350" Width="525">  
  7.     <Window.DataContext>  
  8.         <loc:MainWindowViewModel />  
  9.     </Window.DataContext>  
  10.     <Grid>  
  11.         <Button Content="Button" Height="38" HorizontalAlignment="Left" Margin="50,52,0,0" Name="button1" VerticalAlignment="Top" Width="138">  
  12.             <i:Interaction.Triggers>  
  13.                 <i:EventTrigger EventName="Click">  
  14.                     <i:InvokeCommandAction   
  15.                         Command="{Binding ClickCommand}" CommandParameter="{Binding ElementName=button1}" />  
  16.                 </i:EventTrigger>  
  17.             </i:Interaction.Triggers>  
  18.         </Button>  
  19.     </Grid>  
  20. </Window>  

現(xiàn)在為了擴(kuò)展CommandParameter,定義ExCommandParameter類

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Windows;  
  6.   
  7. namespace EventArgsInViewModel {  
  8.     /// <summary>  
  9.     /// 擴(kuò)展CommandParameter,使CommandParameter可以帶事件參數(shù)  
  10.     /// </summary>  
  11.     public class ExCommandParameter {  
  12.         /// <summary>  
  13.         /// 事件觸發(fā)源  
  14.         /// </summary>  
  15.         public DependencyObject Sender { getset; }  
  16.         /// <summary>  
  17.         /// 事件參數(shù)  
  18.         /// </summary>  
  19.         public EventArgs EventArgs { getset; }  
  20.         /// <summary>  
  21.         /// 額外參數(shù)  
  22.         /// </summary>  
  23.         public object Parameter { getset; }  
  24.     }  
  25. }  


然后定義ExInvokeCommandAction類,用于擴(kuò)展InvokeCommandAction

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Windows;  
  6. using System.Windows.Interactivity;  
  7. using System.Windows.Input;  
  8. using System.Reflection;  
  9.   
  10. namespace EventArgsInViewModel {  
  11.     /// <summary>  
  12.     /// 擴(kuò)展的InvokeCommandAction  
  13.     /// </summary>  
  14.     public class ExInvokeCommandAction : TriggerAction<DependencyObject> {  
  15.   
  16.         private string commandName;  
  17.         public static readonly DependencyProperty CommandProperty = DependencyProperty.Register("Command"typeof(ICommand), typeof(ExInvokeCommandAction), null);  
  18.         public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.Register("CommandParameter"typeof(object), typeof(ExInvokeCommandAction), null);  
  19.         /// <summary>  
  20.         /// 獲得或設(shè)置此操作應(yīng)調(diào)用的命令的名稱。  
  21.         /// </summary>  
  22.         /// <value>此操作應(yīng)調(diào)用的命令的名稱。</value>  
  23.         /// <remarks>如果設(shè)置了此屬性和 Command 屬性,則此屬性將被后者所取代。</remarks>  
  24.         public string CommandName {  
  25.             get {  
  26.                 base.ReadPreamble();  
  27.                 return this.commandName;  
  28.             }  
  29.             set {  
  30.                 if (this.CommandName != value) {  
  31.                     base.WritePreamble();  
  32.                     this.commandName = value;  
  33.                     base.WritePostscript();  
  34.                 }  
  35.             }  
  36.         }  
  37.         /// <summary>  
  38.         /// 獲取或設(shè)置此操作應(yīng)調(diào)用的命令。這是依賴屬性。  
  39.         /// </summary>  
  40.         /// <value>要執(zhí)行的命令。</value>  
  41.         /// <remarks>如果設(shè)置了此屬性和 CommandName 屬性,則此屬性將優(yōu)先于后者。</remarks>  
  42.         public ICommand Command {  
  43.             get {  
  44.                 return (ICommand)base.GetValue(ExInvokeCommandAction.CommandProperty);  
  45.             }  
  46.             set {  
  47.                 base.SetValue(ExInvokeCommandAction.CommandProperty, value);  
  48.             }  
  49.         }  
  50.         /// <summary>  
  51.         /// 獲得或設(shè)置命令參數(shù)。這是依賴屬性。  
  52.         /// </summary>  
  53.         /// <value>命令參數(shù)。</value>  
  54.         /// <remarks>這是傳遞給 ICommand.CanExecute 和 ICommand.Execute 的值。</remarks>  
  55.         public object CommandParameter {  
  56.             get {  
  57.                 return base.GetValue(ExInvokeCommandAction.CommandParameterProperty);  
  58.             }  
  59.             set {  
  60.                 base.SetValue(ExInvokeCommandAction.CommandParameterProperty, value);  
  61.             }  
  62.         }  
  63.         /// <summary>  
  64.         /// 調(diào)用操作。  
  65.         /// </summary>  
  66.         /// <param name="parameter">操作的參數(shù)。如果操作不需要參數(shù),則可以將參數(shù)設(shè)置為空引用。</param>  
  67.         protected override void Invoke(object parameter) {  
  68.             if (base.AssociatedObject != null) {  
  69.                 ICommand command = this.ResolveCommand();  
  70.   
  71.                 /* 
  72.                  * ★★★★★★★★★★★★★★★★★★★★★★★★ 
  73.                  * 注意這里添加了事件觸發(fā)源和事件參數(shù) 
  74.                  * ★★★★★★★★★★★★★★★★★★★★★★★★ 
  75.                  */  
  76.                 ExCommandParameter exParameter = new ExCommandParameter {  
  77.                     Sender=base.AssociatedObject,  
  78.                     Parameter = GetValue(CommandParameterProperty),  
  79.                     EventArgs=parameter as EventArgs  
  80.   
  81.                 };  
  82.                   
  83.                 if (command != null && command.CanExecute(exParameter)) {  
  84.                     /* 
  85.                      * ★★★★★★★★★★★★★★★★★★★★★★★★ 
  86.                      * 注意將擴(kuò)展的參數(shù)傳遞到Execute方法中 
  87.                      * ★★★★★★★★★★★★★★★★★★★★★★★★ 
  88.                      */  
  89.                     command.Execute(exParameter);  
  90.                 }  
  91.             }  
  92.         }  
  93.         private ICommand ResolveCommand() {  
  94.             ICommand result = null;  
  95.             if (this.Command != null) {  
  96.                 result = this.Command;  
  97.             } else {  
  98.                 if (base.AssociatedObject != null) {  
  99.                     Type type = base.AssociatedObject.GetType();  
  100.                     PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);  
  101.                     PropertyInfo[] array = properties;  
  102.                     for (int i = 0; i < array.Length; i++) {  
  103.                         PropertyInfo propertyInfo = array[i];  
  104.                         if (typeof(ICommand).IsAssignableFrom(propertyInfo.PropertyType) && string.Equals(propertyInfo.Name, this.CommandName, StringComparison.Ordinal)) {  
  105.                             result = (ICommand)propertyInfo.GetValue(base.AssociatedObject, null);  
  106.                         }  
  107.                     }  
  108.                 }  
  109.             }  
  110.             return result;  
  111.         }  
  112.   
  113.     }  
  114. }  


好了,我們把xaml改一下,現(xiàn)在改用我們自己創(chuàng)建的ExInvokeCommandAction

  1. <Window x:Class="EventArgsInViewModel.MainWindow"  
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  4.         xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"  
  5.         xmlns:loc="clr-namespace:EventArgsInViewModel"  
  6.         Title="MainWindow" Height="350" Width="525">  
  7.     <Window.DataContext>  
  8.         <loc:MainWindowViewModel />  
  9.     </Window.DataContext>  
  10.     <Grid>  
  11.         <Button Content="Button" Height="38" HorizontalAlignment="Left" Margin="50,52,0,0" Name="button1" VerticalAlignment="Top" Width="138">  
  12.             <i:Interaction.Triggers>  
  13.                 <i:EventTrigger EventName="Click">  
  14.                     <!--★★★擴(kuò)展的InvokeCommandAction★★★-->  
  15.                     <loc:ExInvokeCommandAction   
  16.                         Command="{Binding ClickCommand}" CommandParameter="{Binding ElementName=button1}" />  
  17.                 </i:EventTrigger>  
  18.             </i:Interaction.Triggers>  
  19.         </Button>  
  20.     </Grid>  
  21. </Window>  

ViewModel代碼

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Windows.Input;  
  6. using Microsoft.Practices.Prism.Commands;  
  7. using System.Windows;  
  8.   
  9. namespace EventArgsInViewModel {  
  10.     public class MainWindowViewModel {  
  11.         public ICommand ClickCommand {  
  12.             get {  
  13.                 return new DelegateCommand<ExCommandParameter>((p) => {  
  14.                     RoutedEventArgs args = p.EventArgs as RoutedEventArgs;  
  15.                     MessageBox.Show(args.ToString());  
  16.                 },  
  17.                 (p) => {  
  18.                     return true;  
  19.                 }  
  20.                 );  
  21.             }  
  22.         }  
  23.     }  
  24. }  



現(xiàn)在點(diǎn)擊一下按鈕,顯示了對應(yīng)的消息框,OK,參數(shù)也能得到。是不是也很容易啊。
那么有人問,除了ExInvokeCommandAction我也會(huì),但是ExInvokeCommandAction讓人想破腦袋也不會(huì)寫。其實(shí),我也不會(huì)寫,我只是用ILSpy反編譯了一下,然后稍稍改動(dòng)而已(這個(gè)我還是可以做到的)。
最后我想說:“其實(shí)你只要?jiǎng)幽X筋都做到的事很多!”

下載地址:http://qing2005.download.csdn.net/

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多