在 WPF 程式中使用 MVVM 模式

2021-09-06 16:12:32 字數 2438 閱讀 5373

mvvm 模式是乙個很久之前的技術了,最近因為乙個專案的原因,需要使用 wpf 技術,所以,重新翻出來從前的一段程式,重溫一下當年的技術。

mvvm 實際上涉及三個部分,model, view 和 viewmodel ,三者的關係如下圖所示。

在三部分的關係中,檢視顯示的內容和操作完全依賴於 viewmodel。

model 是應用程式的核心,代表著最大、最重要的業務資產,因為它記錄了所有複雜的業務實體、它們之間的關係以及它們的功能。

model 之上是 viewmodel。viewmodel 的兩個主要目標分別是:使 model 能夠輕鬆被 wpf/xaml view 使用;將 model 從 view 分離並對 model 進行封裝。這些目標當然非常好,但是由於一些現實的原因,有時並不能達到這些目標。

您構建的 viewmodel 知道使用者在高層上將如何與應用程式互動。但是,viewmodel 對 view 一無所知,這是 mvvm 設計模式的重要部分。這使得互動設計師和圖形設計師能夠在 viewmodel 的基礎上建立優美、有效的 ui,同時與開發人員密切配合,設計適當的 viewmodel 來支援其工作。此外,view 與 viewmodel 的分離還使得 viewmodel 更有利於單元測試和重用。

由於檢視模型的變化要影響到檢視的狀態,我們需要使用兩個重要的技術:可觀察物件和命令模式。

可觀察物件要求當物件的狀態發生變化的時候,需要能夠主動通知所有的觀察者,在 wpf 中涉及到兩個重要的介面 inotifypropertychanged 和 inotifycollectionchanged,它們分別用來表示單個物件的狀態發生了變化,和乙個集合發生了變化。

inotifypropertychanged 介面的定義如下所示:

namespace

system.componentmodel

}

這是乙個介面,通常我們會定義乙個實現這個介面的基類來便於使用。在下面的實現中,通過事件來通知所有的觀察者。

namespace

mvvm.framework}}

}

而 inotifycollectionchanged 的定義如下,系統已經提供了乙個泛型的實現 observablecollection,定義在命名空間 system.collections.objectmodel 中,我們可以直接使用。

namespace

system.collections.specialized

}

對於命令模式來說,最重要的就是我們將每個命令封裝為乙個物件,這裡涉及的介面是 icommand,定義如下:

namespace

system.windows.input

}

命令中,不僅包含了執行的方法,還包含了用來判斷是否可以執行的方法,以及當是否可以執行發生變化的事件,這使得我們可以在資料狀態發生變化的時候,動態通知檢視的顯示也同時發生變化,比如,在沒有資料的情況下,修改按鈕是不可用的,當已經存在資料的情況下,修改按鈕就進入可用狀態等等。

通常我們會實現這個介面。我們自己來提供兩個方法分別實現需要執行的操作和判斷是否可以執行的條件。這裡涉及到兩個委託。

predicate 委託表示乙個返回 bool 值的方法,這是乙個泛型委託,我們可以傳遞乙個引數進來,作為判斷的條件。

namespace

system

而 action 委託則表示乙個沒有返回值的方法。我們在 view 中進行操作的時候,通常需要改變的是 viewmodel 的狀態,並不需要返回結果給 view。

namespace

system

這樣,我們預設的命令實現就成為如下的形式,delegaecommand 建構函式接收兩個方法,乙個就是被封裝的實際操作,乙個用來判斷是否可用的方法。

另外額外提供了乙個 updatecanexecutestate 方法, 在每次執行處理方法之後,自動呼叫一下,更新是否可用的狀態。

namespace

mvvm.framework

#region icommand members

public

event

eventhandler canexecutechanged;

//檢查是否可以執行

public

bool canexecute(object

parameter)

return

true

; }

//執行操作

public

void execute(object

parameter)

//執行之後,更新是否可以執行的狀態

updatecanexecutestate();

}#endregion

public

void

updatecanexecutestate()}}

}

第一部分先到這裡,後面我們繼續進行。

在WPF中使用MVVM的方式關閉視窗

在wpf程式中經常需要用彈出視窗的形式向使用者確認操作,使用者閱讀完相關資訊後,點選上面的ok或者cancel按鈕來關閉視窗,再進行後續操作。當使用mvvm設計模式時,ok和cancel會binding到viewmodel中的相關屬性上,因而在使用者點選了ok或cancel之後,我們希望能夠在vie...

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

規模稍大的wpf專案一般會採用mvvm模式,常見的框架有prism mvvmlight caliburn等。今天就從頭開始建立乙個使用mvvm模式的wpf專案,對mvvm也能有乙個更好的了解。實現inotifypropertychanged介面是為了利用wpf的資料繫結特性,當資料來源發生變化時,能...

在WPF程式中使用多執行緒技術

在wpf應用程式中使用多執行緒的方式與windows forms很類似,區別在於,如果需要更新主線程ui上面的元素,需要用乙個特殊的方法 this.dispatcher.invoke 下面是乙個簡單的範例,演示了如何執行乙個簡單的方法,它使用了callback的機制進行多執行緒非同步執行。func ...