WPF隨筆(十二) 使用MVVM模式

2021-10-03 03:22:37 字數 3582 閱讀 7389

規模稍大的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...