WPF使用MVVM(二) 命令繫結

2022-09-18 13:54:11 字數 3631 閱讀 7325

上一節已經介紹了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介面,需要我們自己建立型別去實現介面的canexecuteexecutecanexecutechanged,下面直接貼一下實現介面的**,需要新建乙個類,名字我們取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屬性來傳,這裡我們將按鈕自己傳過去!

執行斷點看一下,能夠看到按鈕自身已經當作引數傳入了:

下一節說一下事件的繫結,讓其他事件,如mouseentermousele**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...