規模稍大的wpf專案一般會採用mvvm模式,常見的框架有prism、mvvmlight、caliburn等。今天就從頭開始建立乙個使用mvvm模式的wpf專案,對mvvm也能有乙個更好的了解。
實現inotifypropertychanged介面是為了利用wpf的資料繫結特性,當資料來源發生變化時,能及時通知ui層進行重新整理,避免手動重新整理ui的問題。
public
class
viewmodelbase
: inotifypropertychanged
#endregion
}
wpf預設的互動方式是事件驅動的,即ui層的動作觸發路由事件,資料層在路由事件的函式中進行相應處理。實現icommand介面是為了將ui層和資料層解耦,避免繫結路由事件時的強關聯。
public
class
delegatecommands
: icommand
public
delegatecommands
(action
executemethod, func
canexecutemethod)
#region icommand 成員
///
/// method to determine if the command can be executed
///
public bool canexecute
(t parameter)
return
true;}
///
/// execution of the command
///
public
void
execute
(t parameter)
} #endregion
event eventhandler icommand.canexecutechanged
remove
} #region icommand 成員
public bool canexecute
(object parameter)
return
canexecute
((t)parameter);}
public
void
execute
(object parameter)
#endregion
}
新建mainwindowviewmodel類,繼承自上面的viewmodelbase類,用於命令的繫結觸發和資料的處理通知。
public
class
mainwindowviewmodel
:viewmodelbase
#region properties-屬性
private list
_goodslist;
public list
goodslist
set}}
#endregion
#region commands-命令
public delegatecommands
addcommand
public delegatecommands
editcommand
public delegatecommands
deletecommand
#endregion
#region methods-方法
private
void
initdata()
};}private
void
add(string obj)
private
void
edit
(detailgoodsdto obj)
private
void
delete
(detailgoodsdto obj)
#endregion
}
修改mainwindow.xaml,與mainwindowviewmodel中的屬性和命令一一對應。
"abpdemo.client.mainwindow"
xmlns=
""xmlns:x=
""xmlns:d=
""xmlns:mc=
""xmlns:local=
"clr-namespace:abpdemo.client"
mc:ignorable=
"d" title=
"mainwindow" height=
"450" width=
"800"
>
"5">
"80"
>
<
/rowdefinition>
<
/rowdefinition>
<
/grid.rowdefinitions>
"0" verticalalignment=
"center" horizontalalignment=
"right"
>
"" commandparameter=
"add"
>新增<
/button>
"" commandparameter=
"">編輯<
/button>
"" commandparameter=
"">刪除<
/button>
<
"goodsdata" grid.row=
"1" autogeneratecolumns=
"false" selectionunit=
"fullrow" itemssource=
"">
"貨品名稱" width=
"*" binding=
"">
<
/datagridtextcolumn>
"貨品型別" width=
"*" binding=
"">
<
/datagridtextcolumn>
"存放位置" width=
"*" binding=
"">
<
/datagridtextcolumn>
"貨品數量" width=
"*" binding=
"">
<
/datagridtextcolumn>
<
/datagrid.columns>
<
/datagrid>
<
/grid>
<
/window>
同時修改mainwindow.xaml.cs以建立view檢視層與viewmodel檢視模型層的關聯關係。
public partial class
mainwindow
: window
}
以上步驟就完成了最簡單的mvvm模式。 WPF隨筆(十三) MVVM模式下的視窗管理
使用mvvm模式的wpf專案和傳統的使用事件驅動模式的wpf在處理邏輯有所不同,即使最簡單的開啟視窗也有很大差異。public static class windowmanager 註冊視窗 public static void regiter string key,type t 移除視窗 publ...
在 WPF 程式中使用 MVVM 模式
mvvm 模式是乙個很久之前的技術了,最近因為乙個專案的原因,需要使用 wpf 技術,所以,重新翻出來從前的一段程式,重溫一下當年的技術。mvvm 實際上涉及三個部分,model,view 和 viewmodel 三者的關係如下圖所示。在三部分的關係中,檢視顯示的內容和操作完全依賴於 viewmod...
WPF使用MVVM(二) 命令繫結
上一節已經介紹了wpf的屬性繫結,這使得我們只需要指定介面的datacontext,然後就可以讓介面繫結我們的屬性資料呢。但是上一節還遺留了乙個問題就是我們的按鈕的click方法,依然是寫在介面的後台中的,現在我們希望將按鈕的click方法也採用繫結的形式。原先是這樣的 希望變成這樣 讓我們的mai...