自從上一次寫mvvm入門到現在,又過了好長時間了,一直想著把事件的繫結總結一下,但是一來是認識的不夠,感覺講不清楚;二來是懶。不管了,寫的不對的地方大家提一下,錯誤要是不暴露它就一直是錯誤。
先說按鈕的事件繫結,.net中提供的icommand就是這麼用的,自己寫乙個command的基類,繼承
icommand,實現icommand的3個方法,最簡單的實現:
1view codepublic
class
commandbase: icommand29
10public
event
eventhandler canexecutechanged
1117
remove
1821}22
23//
按鈕的執行事件
24public
void execute(object
parameter)
2528
#endregion
29 }
這段**中,canexecutechanged是重點,註冊事件和移除事件。
execute在按鈕點選的時候執行,使用下邊的**,按鈕的事件就繫結了。
1view codepublic
icommand closecommand
27 }
但是這樣,按鈕是什麼操作都不會做的,實現了也沒有任何實際意義。在按鈕點選的執行方法裡面,執行了乙個預設的action,action是乙個委託類,所以,可以在構造的時候傳乙個委託的具體實現方法,建構函式加乙個引數,改造一下,基類裡面新增乙個建構函式,然後就可以使用自己定義的方法了。
1view codepublic
commandbase(action excutemethod)
27 _excutemethod =excutemethod; 89
}1011public
icommand closecommand
1217
} 18
void
close()
19
**寫的有點囉嗦,不過,總體來說,是我認識的乙個過程。
下乙個問題,commandbase基類中的**是怎麼執行的?
get完畢,closecommand繫結事件,然後執行canexecutechanged,註冊事件。
canexcute是怎麼執行的?輸出視窗提示, 單步執行: 正在逐過程執行非使用者帶**「system.windows.controls.primitives.buttonbase.hookcommand」,msdn上說這個命名空間在presentationframework.dll中,用reflector看了下也沒找到,o(╯□╰)o,先記下這個問題。
依賴項通知,在文字改變的時候,通知介面,主要用到inotifypropertychanged,定義乙個
繼承inotifypropertychanged的基類。
1view codepublic
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 }
按鈕content繫結value屬性即可。
1view codepublic
string
value
2
本來想寫一下,文字改變之後新增乙個自定義的事件,想了想還是算了,在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...