日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

管窥MVVMLight Command参数绑定和事件传递

發(fā)布時間:2024/4/14 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 管窥MVVMLight Command参数绑定和事件传递 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原文:管窺MVVMLight Command參數(shù)綁定和事件傳遞

前言

由于在實際項目中,業(yè)務(wù)功能的增加導(dǎo)致軟件開發(fā)規(guī)模在逐漸變大,所以我準(zhǔn)備找個Silverlight框架來組織當(dāng)前項目中的文件,以期能夠讓后續(xù)的業(yè)務(wù)功能增添和維護更加容易一些。無意中,我在這篇文章中看到了當(dāng)前Silverlight下所有的框架的評測:Discover and compare existing MVVM frameworks !,當(dāng)我看到MvvmLight toolkit在各方面都比較完備的時候,于是決定選擇這個框架:

在Codeplex網(wǎng)站上,下載了MVVM Light Toolkit V4 RTM這個版本,因為我用的是vs2010,所以我下載了支持當(dāng)前機器IDE的版本。

新建項目,選擇MvvmLight(SL4),之后我們就可以看到項目結(jié)構(gòu)了:

其中:

Design文件夾中的文件主要提供設(shè)計時運行支持

Model文件夾則放置了富實體模型

Skins文件夾則放置了樣式文件定義

ViewModel文件夾則放置了ViewModel對象,其實MainViewModel和MainPage是一對一的(ViewMoel-View)關(guān)系.二者的映射通過ViewModelLocator進行。

MainPage.xaml就是我們的視圖頁面

下面我們就以例子來演示MvvmLight Toolkit中是如何實現(xiàn)MVVM模式,如何綁定命令,如何進行事件消息傳遞的。

首先,在這個框架中,MVVM模式的入口點為ViewModelLocator類,在這個類中,可以定義多個ViewModel屬性,并且每個屬性都可以通過ServiceLocator.Current.GetInstance方法進行映射,以便于暴露給前臺綁定。同時,在新增一個ViewModel類的時候,一定要在其提供的SimpleIoc對象容器中進行注冊,以便于能夠通過IOC的方式獲取其實例。

做完映射后,就是我們的ViewModel對象了。它需要繼承自ViewModelBase類,這個類封裝了ICommand,INotifypropertyChanged等接口,使用起來很方便。比如可以用RaisePropertyChanged直接來拋出變更通知。

之后就是View了,在View中,我們需要先對DataContext進行綁定:

DataContext="{Binding Main, Source={StaticResource Locator}}"

然后就可以隨心所欲的操作了。

?

然后,我們來講解下綁定命令。

由于命令綁定是應(yīng)用程序中必不可少的環(huán)節(jié),所以這里我以 綁定無參事件,綁定一個參數(shù)事件,綁定多個參數(shù)事件來說明。

綁定無參事件:

#region Command without parametersprivate RelayCommand showText;public RelayCommand ShowText{get{if (showText == null)showText = new RelayCommand(ShowTextFunc);return showText;}}public RelayCommand PassEvent { get; set; }private void ShowTextFunc(){MessageBox.Show("I am RealyCommand!");}#endregion

上面代碼就是綁定無參事件,在View上可以通過如下方式綁定:

<Button Content="綁定無參事件" Command="{Binding ShowText}" Height="23" HorizontalAlignment="Left" Margin="32,62,0,0" Name="button1" VerticalAlignment="Top" Width="141" />

?

綁定一個參數(shù)事件:

#region Command with a parameter private RelayCommand<int> showValue;public RelayCommand<int> ShowValue{get{if (showValue == null)showValue = new RelayCommand<int>(x=>ShowValueFunc(x));return showValue;}}private int ShowValueFunc(int a){int c = a + 10;MessageBox.Show(c.ToString());return c;}#endregion

上面的代碼部分就是綁定一個參數(shù)的事件定義,我們來驅(qū)動view層:

<Button Content="綁定一個參數(shù)事件" Command="{Binding ShowValue}" CommandParameter="{Binding ElementName=textBox1,Path=Text,Converter={StaticResource IntConverter}}" Height="23" HorizontalAlignment="Left" Margin="32,103,0,0" Name="button2" VerticalAlignment="Top" Width="141" />

需要說明的是,上面代碼示例中,CommandParameter的值來自于textBox1的Text屬性中。這個值加上10以后返回。

如果遇到用戶輸入不是數(shù)字的情況,則通過IntConverter方法將用戶輸入格式化,然后返回:

public class IntConverter:IValueConverter{public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){int result;if(Int32.TryParse(value.ToString(),out result)){return result;}return "0";}public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){throw new NotImplementedException();}}

綁定多個參數(shù)事件:

由于RelayCommand默認(rèn)最多允許一個參數(shù)傳遞,所以這里如果想傳遞多個數(shù)據(jù)對象,只能夠去構(gòu)建自己的DTO了。

在Model文件夾新建一個BookItem類:

public class BookItem{public string BName { get; set; }public string BAuthor { get; set; }}

然后在ViewModel中進行如下控制:

#region Command with multiple parametersprivate RelayCommand<BookItem> showBooks;public RelayCommand<BookItem> ShowBooks{get{if (showBooks == null)showBooks = new RelayCommand<BookItem>(x=>ShowBooksFunc(x));return showBooks;}}private void ShowBooksFunc(BookItem bookItem){MessageBox.Show(bookItem.BName+"|"+bookItem.BAuthor);}#endregion

驅(qū)動View層:

<Button Command="{Binding ShowBooks}" Content="綁定多個參數(shù)事件" Height="23" HorizontalAlignment="Left" Margin="32,141,0,0" Name="button3" VerticalAlignment="Top" Width="141" ><Button.CommandParameter><model:BookItem BName="testName" BAuthor="TestAuthor" ></model:BookItem></Button.CommandParameter></Button>

運行起來得時候,我們發(fā)現(xiàn)BookItem參數(shù)已經(jīng)被自動賦值了。

ViewModel之間事件傳遞

最后需要講解的是如何在ViewModel之間進行事件傳遞。由于在MVVMLight Toolkit中已經(jīng)集成了Messenger對象,所以我們可以利用其很方便的進行事件傳遞,下面新建一個ChildWindow1.xaml子窗體,然后在ViewModelLocator中添加如下代碼:

public ChildViewModel Child{get{return ServiceLocator.Current.GetInstance<ChildViewModel>();}} SimpleIoc.Default.Register<ChildViewModel>();

然后在ViewModel文件夾中新建一個ChildViewModel類,在其中添加如下代碼:

public class ChildViewModel:ViewModelBase{public ChildViewModel(){Messenger.Default.Register<BookItem>(this, message =>{MyText = message.BName + "|" + message.BAuthor;});}public string MyText { get; set; }}

由于我們傳遞的對象是從 MainViewModel到ChildViewModel,所以我們在MainViewModel中添加如下發(fā)送代碼:

#region Messenger communication cross pageprivate RelayCommand showChildWindow;public RelayCommand ShowChildWindow{get{if (showChildWindow == null)showChildWindow = new RelayCommand(ShowChildWindowFunc);return showChildWindow;}}private void ShowChildWindowFunc(){ChildWindow1 child = new ChildWindow1();child.Show();var bookItem = new BookItem() { BAuthor="TestAuthor",BName="TestName" };Messenger.Default.Send<BookItem>(bookItem);}#endregion

這樣當(dāng)運行起來的時候,我們就能看到效果了:

好了,暫時就到這里,后面我們再深入挖掘。

百度網(wǎng)盤下載

騰訊微盤下載

總結(jié)

以上是生活随笔為你收集整理的管窥MVVMLight Command参数绑定和事件传递的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。