MVVM模式下為Command傳遞多個引數
阿新 • • 發佈:2019-02-06
mvvm模式裡command經常寫在vm中。而command只能傳入一個物件作為執行時的引數,若要傳入多個引數,在.cs檔案(即呼叫vm的command)中,只需要把多個引數加到一個集合裡,傳入command時就把集合當單引數物件傳入就行了。
如:
- public ICommand CMD
- {
- get
- {
- returnnew DelegateCommand<object[]>(x =>
- {
-
var obj0=x[0].ToString();
- var obj1=Convert.ToInt32(x[1]);
- //.................
- });
- }
- }
- //呼叫處:
- {
- .........
- v.CMD.Execute(newobject[]{"1111",456});//v為該CMD所在的vm的例項
- }
但如果在xaml中用到如blend的InvokeCommandAction進行command的繫結,又如何在xaml中進行傳入多引數??
方法有許多種。小弟不才,自己開發了2個類來解決這問題。先說明一下,此方法只使用與silverlight4或以上版本。
先看看應用:
- <Button Command="{Binding CMD}">
- <Button.CommandParameter>
- <sw:MultiDelegateObjects>
- <sw:DelegateObject Key="s1" Value="{Binding Tag, ElementName=t1}"/>
- <sw:DelegateObject Key="s2" Value="888"/>
-
</sw:MultiDelegateObjects>
- </Button.CommandParameter>
- </Button>
- vm:
- public ICommand CMD
- {
- get
- {
- returnnew DelegateCommand<MultiDelegateObjects>(x =>
- {
- //使用key或索引來獲取集合的元素。key不區分大小寫.
- //使用key可以不要考慮在xaml中的位置。
- var obj0=x["s1"] as Page;//或x.GetValue<Page>("s1");
- var obj1=x["s2"].ToString();
- var obj2=x[1].ToString();//obj1==obj2;
- //.................
- });
- }
- }
原文地址:http://blog.csdn.net/zeroswl/article/details/6132279