WPF中的命令(Command)
????這節(jié)來講一下WPF中的命令(Command)的使用。
【認(rèn)識(shí)Command】
????我們之前說過,WPF本身就為我們提供了一個(gè)基礎(chǔ)的MVVM框架,本節(jié)要講的命令就是其中一環(huán),通過在ViewModel中聲明命令,從View中使用Binding綁定命令,就能實(shí)現(xiàn)從View到ViewModel之間操作的流通。
????ICommand 接口:
????所有的命令都是需要繼承ICommand接口,該接口有如下三個(gè)成員:
????我們先說第二個(gè)成員,它是個(gè)返回值為bool的方法,通過這個(gè)方法,可以設(shè)置命令能不能繼續(xù)執(zhí)行,即返回值為TRUE,命令繼續(xù)執(zhí)行,返回值為FALSE命令不會(huì)執(zhí)行;
????第一個(gè)成員是個(gè)事件處理器,從名字可以看出來該事件處理器關(guān)注于第二個(gè)成員,也就是當(dāng)命令能否執(zhí)行的狀態(tài)出現(xiàn)改變時(shí)可以使用此事件通知到關(guān)注此命令執(zhí)行狀態(tài)的成員;
????第三個(gè)成員也是個(gè)方法,命令的執(zhí)行邏輯放在這個(gè)方法里邊,當(dāng)CanExecute返回值為TRUE時(shí),該方法才會(huì)被執(zhí)行。
【自定義Command】
????下面我們就來自定義一個(gè)命令,這樣能比較方便的演示命令的使用:
????本節(jié)以MVVM模式演示,項(xiàng)目結(jié)構(gòu)如下:
??? MyCommand為自定義的命令類,代碼如下:
? ? MyCommand類在實(shí)例化時(shí)需要外部傳入執(zhí)行的方法以及能否繼續(xù)執(zhí)行的判斷方法。
??? MainViewModel中的代碼如下:
????在ViewModel中聲明命令要注意,命令必須是屬性,不能是字段。
??? View代碼如下:
????在Button有個(gè)Command屬性,我們可以直接使用Binding和ViewModel中的命令對(duì)象做綁定。
????此處要注意MainView的構(gòu)造方法中這一行代碼:
??? DataContext屬性要設(shè)置為ViewModel實(shí)例,這樣View才能跟ViewModel關(guān)聯(lián)上,從而使用Binding才能綁定上MyCommand命令。
????另外需要知道的是,Button中的Command是通過點(diǎn)擊觸發(fā)的,也就是說當(dāng)你點(diǎn)擊的Button命令就會(huì)執(zhí)行,其它的控件,如ListBox中的Item,需要雙擊才能執(zhí)行命令,因?yàn)閱螕羰沁x中Item。
????當(dāng)程序運(yùn)行時(shí),點(diǎn)擊按鈕,輸出窗口會(huì)打印“命令被執(zhí)行了”字樣:
????然后我們清除掉輸出窗口的內(nèi)容,當(dāng)再一次點(diǎn)擊按鈕時(shí),因?yàn)閕sCanExec被設(shè)置為FALSE,所以命令終止執(zhí)行,輸出窗口無內(nèi)容:
【命令參數(shù)CommandParameter】
????如果命令僅僅是這樣使用,那就太單調(diào)了,大家肯定注意到了Execute和CanExecute方法還有個(gè)類型為object的參數(shù),這個(gè)參數(shù)就是命令參數(shù),它可以接收我們自定義的數(shù)據(jù),在執(zhí)行命令時(shí)傳入進(jìn)來,我們則可以根據(jù)這個(gè)參數(shù),對(duì)執(zhí)行邏輯做多樣化的判斷,下面我將代碼稍作改變:
????在界面上放置兩個(gè)按鈕,并修改ViewModel代碼為如下所示:
????在Button中使用CommandParameter屬性設(shè)置命令的參數(shù),默認(rèn)會(huì)將數(shù)據(jù)當(dāng)做string處理,當(dāng)然它也可以使用Binding跟其它屬性做綁定,關(guān)于View與ViewModel之間的數(shù)據(jù)綁定,我們后期講解。
????在MyCommand的執(zhí)行邏輯中判斷參數(shù)的值,從而輸出不同的結(jié)果,一次點(diǎn)擊按鈕結(jié)果如下:
本節(jié)到此結(jié)束,今天是1024程序員節(jié),祝大家節(jié)日快樂!
總結(jié)
以上是生活随笔為你收集整理的WPF中的命令(Command)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “快准顺”而不是“信达雅”
- 下一篇: Dapr牵手.NET学习笔记:Actor