上一節已經介紹了wpf的屬性繫結,這使得我們只需要指定介面的datacontext,然後就可以讓介面繫結我們的屬性資料呢。
但是上一節還遺留了乙個問題就是我們的按鈕的click方法,依然是寫在介面的後台中的,現在我們希望將按鈕的click方法也採用繫結的形式。
原先是這樣的:
希望變成這樣:
讓我們的mainwindowvm(viewmodel)也提供乙個方法,讓我們繫結一下,這樣介面的資料和按鈕的點選處理邏輯,都放到了橋梁viewmodel中了,介面看起來也很清爽。
wpf呢,為了讓我們用mvvm的形式替換按鈕的點選行為,給我們提供了乙個command的屬性,讓我們也可以像繫結屬性的方式,來繫結我們的點選方法,具體的寫法如下:
之前寫的button_click方法也可以直接刪除了。
注意:command屬性僅僅作為click行為的繫結,其他行為,如滑鼠移入、移出。。。等行為,要使用另外的mvvm方式進行繫結。(本文只介紹點選行為,後續介紹其他行為的mvvm實現)
上面我們也刪除了button_click方法,並且還給button按鈕的command屬性繫結了乙個方法叫做clickaction,接下來我們就要在mainwindowvm(viewmodel)中去新增這個方法。
要實現繫結的方法clickaction,就需要用到icommand介面,需要我們自己建立型別去實現介面的canexecute、execute、canexecutechanged,下面直接貼一下實現介面的**,需要新建乙個類,名字我們取relaycommand:
public class relaycommand : icommand
/// /// 判斷命令是否可以執行
///
///
///
public bool canexecute(object parameter)
/// /// 執行命令
///
///
public void execute(object parameter)
/// /// 事件追加、移除
///
public event eventhandler canexecutechanged
remove}}
建立這個類,就是為了在使用命令的時候, 建立一條命令出來用於繫結,這個型別接收兩個引數,乙個是命令執行的方法,另乙個是有返回值的方法, 這個返回值bool用來確定,該條命令是否可以執行,如果命令不能被執行,則按鈕的isenabled就被會設定成不可點選,下面我們來挨個看下效果
剛才我們已經做好了建立命令的準備工作,下面直接建立乙個命令,並給這個命令指定乙個方法即可。
在mainwindowvm新增如下**:
/// /// 命令要執行的方法
///
void updatenameexecute()
/// /// 命令是否可以執行
///
///
bool canupdatenameexecute()
/// /// 建立新命令
///
public icommand clickaction
}
注意,建立這個新的命令的名字需要和我們介面按鈕command中繫結的名字一致,叫clickaction。
這時候我們執行一下程式,點選按鈕,可以看到命令是可以生效的。
此時我們做乙個小小的改動,我們將是否可以執行的方法返回為false:
/// /// 命令是否可以執行
///
///
bool canupdatenameexecute()
再次執行能夠看到,介面中按鈕已經是不可點選的狀態了!
所以我們繫結的這個命令是否可以執行,是直接影響到按鈕能否被點選的!這個值會直接作用在按鈕的isenabled上。
上面的命令就是純命令,啥引數都沒帶上,有時候希望執行命令的時候,希望能夠傳個引數,那就需要改造一下了!
採用泛型的形式,給action加點料,重新貼一下relaycommand的**:
public class relaycommand: icommand
/// /// 判斷命令是否可以執行
///
///
///
public bool canexecute(object parameter)
/// /// 執行命令
///
///
public void execute(object parameter)
/// /// 事件追加、移除
///
public event eventhandler canexecutechanged
remove}}
在mainwindowvm(viewmodel)中建立的命令和給到的方法也要有點小變化:
/// /// 命令要執行的方法
///
void updatenameexecute(object sender)
/// /// 命令是否可以執行
///
///
bool canupdatenameexecute()
/// /// 建立新命令
///
public icommand clickaction
}
引數從**傳呢, 當然是我們的介面傳了,通過按鈕的commandparameter屬性來傳,這裡我們將按鈕自己傳過去!
執行斷點看一下,能夠看到按鈕自身已經當作引數傳入了:
下一節說一下事件的繫結,讓其他事件,如mouseenter、mousele**e也能夠像按鈕的command一樣。
WPF與MVVM的實現(四)命令繫結
接觸 wpf已經有兩年,大大小小開發過幾個專案,但從來沒有系統的去學習過。幾次開發專案時都覺得十分的惱火,太多的事件稍微考慮不到位就會帶來麻煩,為此特地系統的看了一本 c 高階程式設計 第 10版,了解到 mvvm 框架,看了之後十分歡喜,本篇記錄研究 mvvm 過程。0001 icommand介面...
wpf繫結全域性靜態變數(mvvm)
在實際的開發中,有一些集合或者屬性可能是全域性的,比如當你做乙個oa的時候,可能需要展示所有的人員,這時這個所有的人員列表顯然可以作為全域性引數,比如這裡有乙個全域性的靜態屬性userlist。而你在使用mvvm做wpf開發的時候,一般每個view都已經指定好了viewmodel。而viewmode...
MVVM命令繫結幾種寫法小結
通過 mvvm 模式,實現控制項自身就具有的事件,如 selectionchanged xmlns i clr namespace system.windows.interactivity assembly system.windows.interactivity i interaction.tri...