MVVM模式下为Command传递多个参数

   mvvm模式里command经常写在vm中。而command只能传入一个对象作为执行时的参数,若要传入多个参数,在.cs文件(即调用vm的command)中,只需要把多个参数加到一个集合里,传入command时就把集合当单参数对象传入就行了。

     如:

  1. public ICommand CMD  
  2.    {  
  3.        get   
  4.        {  
  5.            return new 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.     .........  
  17.     v.CMD.Execute(new object[]{"1111",456});//v为该CMD所在的vm的实例  
  18. }  


但如果在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.   
  10. vm:  
  11. public ICommand CMD  
  12. {  
  13.    get   
  14.    {  
  15.       return new DelegateCommand<MultiDelegateObjects>(x =>  
  16.       {  
  17.           //使用key或索引来获取集合的元素。key不区分大小写.  
  18.           //使用key可以不要考虑在xaml中的位置。  
  19.           var obj0=x["s1"as Page;//或x.GetValue<Page>("s1");  
  20.           var obj1=x["s2"].ToString();  
  21.           var obj2=x[1].ToString();//obj1==obj2;  
  22.           //.................  
  23.       });  
  24.    }  
  25. }  


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



展开阅读全文

没有更多推荐了,返回首页