1. 程式人生 > >MVVM模式下為Command傳遞多個引數

MVVM模式下為Command傳遞多個引數

   mvvm模式裡command經常寫在vm中。而command只能傳入一個物件作為執行時的引數,若要傳入多個引數,在.cs檔案(即呼叫vm的command)中,只需要把多個引數加到一個集合裡,傳入command時就把集合當單引數物件傳入就行了。

     如:

  1. public ICommand CMD  
  2.    {  
  3.        get
  4.        {  
  5.            returnnew DelegateCommand<object[]>(x =>  
  6.            {  
  7.                var obj0=x[0].ToString();  
  8.                var obj1=Convert.ToInt32(x[1]);  
  9.                //.................
  10.            });  
  11.        }  
  12.    }  
  13.  //呼叫處:
  14.  {  
  15.     .........  
  16.     v.CMD.Execute(newobject[]{"1111",456});//v為該CMD所在的vm的例項
  17. }  

但如果在xaml中用到如blend的InvokeCommandAction進行command的繫結,又如何在xaml中進行傳入多引數??

     方法有許多種。小弟不才,自己開發了2個類來解決這問題。先說明一下,此方法只使用與silverlight4或以上版本。

先看看應用:

  1. <Button Command="{Binding CMD}">  
  2.    <Button.CommandParameter>  
  3.       <sw:MultiDelegateObjects>  
  4.           <sw:DelegateObject Key="s1" Value="{Binding Tag, ElementName=t1}"/>  
  5.           <sw:DelegateObject Key="s2" Value="888"/>  
  6.       </sw:MultiDelegateObjects>  
  7.    </Button.CommandParameter>  
  8. </Button>  
  9. vm:  
  10. public ICommand CMD  
  11. {  
  12.    get
  13.    {  
  14.       returnnew DelegateCommand<MultiDelegateObjects>(x =>  
  15.       {  
  16.           //使用key或索引來獲取集合的元素。key不區分大小寫.
  17.           //使用key可以不要考慮在xaml中的位置。
  18.           var obj0=x["s1"as Page;//或x.GetValue<Page>("s1");
  19.           var obj1=x["s2"].ToString();  
  20.           var obj2=x[1].ToString();//obj1==obj2;
  21.           //.................
  22.       });  
  23.    }  
  24. }  

原文地址:http://blog.csdn.net/zeroswl/article/details/6132279