WPF中MVVM模式下的按鈕事件實現和依賴項通知

2022-01-28 17:23:57 字數 2294 閱讀 1062

自從上一次寫mvvm入門到現在,又過了好長時間了,一直想著把事件的繫結總結一下,但是一來是認識的不夠,感覺講不清楚;二來是懶。不管了,寫的不對的地方大家提一下,錯誤要是不暴露它就一直是錯誤。

先說按鈕的事件繫結,.net中提供的icommand就是這麼用的,自己寫乙個command的基類,繼承

icommand,實現icommand的3個方法,最簡單的實現:

1

public

class

commandbase: icommand29

10public

event

eventhandler canexecutechanged

1117

remove

1821}22

23//

按鈕的執行事件

24public

void execute(object

parameter)

2528

#endregion

29 }

view code

這段**中,canexecutechanged是重點,註冊事件和移除事件。

execute在按鈕點選的時候執行,使用下邊的**,按鈕的事件就繫結了。

1

public

icommand closecommand

27 }

view code

但是這樣,按鈕是什麼操作都不會做的,實現了也沒有任何實際意義。在按鈕點選的執行方法裡面,執行了乙個預設的action,action是乙個委託類,所以,可以在構造的時候傳乙個委託的具體實現方法,建構函式加乙個引數,改造一下,基類裡面新增乙個建構函式,然後就可以使用自己定義的方法了。

1

public

commandbase(action excutemethod)

27 _excutemethod =excutemethod; 89

}1011public

icommand closecommand

1217

} 18

void

close()

19

view code

**寫的有點囉嗦,不過,總體來說,是我認識的乙個過程。

下乙個問題,commandbase基類中的**是怎麼執行的?

get完畢,closecommand繫結事件,然後執行canexecutechanged,註冊事件。

canexcute是怎麼執行的?輸出視窗提示, 單步執行: 正在逐過程執行非使用者帶**「system.windows.controls.primitives.buttonbase.hookcommand」,msdn上說這個命名空間在presentationframework.dll中,用reflector看了下也沒找到,o(╯□╰)o,先記下這個問題。

依賴項通知,在文字改變的時候,通知介面,主要用到inotifypropertychanged,定義乙個

繼承inotifypropertychanged的基類。

1

public

event

propertychangedeventhandler propertychanged;23

public

delegate

void contextchangedeventhandler(object

sender);

4public

event

contextchangedeventhandler contextchanged;56

protected

void onpropertychanged(string

propertyname)78

92021if (propertychanged != null)22

2324 propertychanged( this, new

propertychangedeventargs(propertyname));

2526

27 }

view code

按鈕content繫結value屬性即可。

1

public

string

value

2

view code

本來想寫一下,文字改變之後新增乙個自定義的事件,想了想還是算了,在viewmodel中value的set裡面直接寫方法就行了,以後發現什麼情況要用的話再做吧。

MVVM模式和在WPF中的實現

我大概是從2102年底開始接觸wpf,之前一直用winform。剛開始看了下感覺跟winform區別不大,控制項可以拖進去,選中了控制項屬性面板可以設定屬性 事件面板可以監聽事件,後台 處理事件,一切都那麼的熟悉。xaml布局也跟android布局很像,所以沒學習就直接開始了,覺得摸索摸索基本就差不...

WPF中MVVM模式下控制項自有的事件繫結

1 原因 在wpf中單純的命令繫結往往不能滿足覆蓋所有的事件,例如combobox的selectionchanged事件,datagrid的selectionchanged事件等等,這時就可以用事件繫結來完成。2 示例 事件繫結需要用到 system.windows.interactivity.dl...

WPF隨筆(十三) MVVM模式下的視窗管理

使用mvvm模式的wpf專案和傳統的使用事件驅動模式的wpf在處理邏輯有所不同,即使最簡單的開啟視窗也有很大差異。public static class windowmanager 註冊視窗 public static void regiter string key,type t 移除視窗 publ...