天天看點

WPF自定義控件與樣式(14)-輕量MVVM模式實踐

一.前言

  申明:WPF自定義控件與樣式是一個系列文章,前後是有些關聯的,但大多是按照由簡到繁的順序逐漸釋出的,若有不明白的地方可以參考本系列前面的文章,文末附有部分文章連結。

  MVVM是WPF中一個非常實用的程式設計模式,充分利用了WPF的綁定機制,展現了WPF資料驅動的優勢。

WPF自定義控件與樣式(14)-輕量MVVM模式實踐

  關于MVVM網上很多介紹或者示例,本文不多做介紹了,本文的主要目的是提供一個輕量級的View Model實作,本文的主要内容:

依賴通知InotifyPropertyChanged實作; 指令Icommand的實作; 消息的實作; 一個簡單MVVM示例;

  對于是否要使用MVVM、如何使用,個人覺得根據具體需求可以靈活處理,不用糾結于模式本身。用了MVVM,後置*.cs檔案就不一定不允許寫任何代碼,混合着用也是沒有問題的, 隻要自己決的友善、代碼結構清晰、維護友善即可。

二.依賴通知InotifyPropertyChanged實作

  依賴通知InotifyPropertyChanged是很簡單的一個接口,是View Model标配的接口,一個典型的實作(BaseNotifyPropertyChanged):  

  然後使用方式就是這樣的:  

  使用上避免了寫死,使用示例:  

三.指令Icommand的實作

  指令的實作也很簡單,實作Icommand的幾個接口就OK了, 考慮到使用時能更加友善,無參數RelayCommand實作:  

  泛型參數RelayCommand<T>的版本:  

  帶參數和不帶參數的指令XAML綁定方式:  

  上面是針對提供Command模式的控件示例, 但對于其他事件呢,比如MouseOver如何綁定呢?可以借用System.Windows.Interactivity.dll,其中的 Interaction 可以幫助我們實作對指令的綁定,這是在微軟Blend中提供的。添加dll應用,然後添加命名空間:

  xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

四.消息的實作

  消息類Messenger主要目的是實作View與View Model及各個子產品之間的通信。本文的消息類Messenger,參考自網絡開源的實作(MVVMFoundation)。實作了松散耦合的消息通知機制,對于消息傳輸參數,内部使用了弱引用(WeakReference),以防止記憶體洩漏代碼:  

WPF自定義控件與樣式(14)-輕量MVVM模式實踐
WPF自定義控件與樣式(14)-輕量MVVM模式實踐

View Code

  在後面的示例中有簡單使用。

五.簡單MVVM示例

5.1 View Model定義實作

  實作一個UserViewModel,定義了兩個通知屬性,3個指令,用于在XAML中實作不同的指令綁定處理,還注冊了一個消息,代碼:  

5.2 測試頁面Page_MVVM.xaml

  建立一個測試頁面Page_MVVM,後置代碼如下,在構造函數裡注入View Model,在一個按鈕事件裡發送消息:  

  完整XAML代碼:  

5.3 效果

WPF自定義控件與樣式(14)-輕量MVVM模式實踐

 附錄:參考引用

<a href="http://www.cnblogs.com/anding/p/4961215.html" target="_blank">WPF自定義控件與樣式(1)-矢量字型圖示(iconfont)</a>

<a href="http://www.cnblogs.com/anding/p/4968050.html" target="_blank">WPF自定義控件與樣式(2)-自定義按鈕FButton</a>

<a href="http://www.cnblogs.com/anding/p/4970845.html" target="_blank">WPF自定義控件與樣式(3)-TextBox &amp; RichTextBox &amp; PasswordBox樣式、水印、Label标簽、功能擴充</a>

<a href="http://www.cnblogs.com/anding/p/4976559.html" target="_blank">WPF自定義控件與樣式(4)-CheckBox/RadioButton自定義樣式</a>

<a href="http://www.cnblogs.com/anding/p/4979764.html">WPF自定義控件與樣式(5)-Calendar/DatePicker日期控件自定義樣式及擴充</a>

<a href="http://www.cnblogs.com/anding/p/4987426.html">WPF自定義控件與樣式(6)-ScrollViewer與ListBox自定義樣式</a>

<a href="http://www.cnblogs.com/anding/p/4990492.html">WPF自定義控件與樣式(7)-清單控件DataGrid與ListView自定義樣式</a>

<a href="http://www.cnblogs.com/anding/p/4993655.html" target="_blank">WPF自定義控件與樣式(8)-ComboBox與自定義多選控件MultComboBox</a>

<a href="http://www.cnblogs.com/anding/p/4996614.html" target="_blank">WPF自定義控件與樣式(9)-樹控件TreeView與菜單Menu-ContextMenu</a>

<a href="http://www.cnblogs.com/anding/p/5006279.html">WPF自定義控件與樣式(11)-等待/忙/正在加載狀态-控件實作</a>

<a href="http://www.cnblogs.com/anding/p/5009120.html">WPF自定義控件與樣式(12)-縮略圖ThumbnailImage /gif動畫圖/圖檔清單</a>

<a href="http://www.cnblogs.com/anding/p/5011981.html">WPF自定義控件與樣式(13)-自定義窗體Window &amp; 自适應内容大小消息框MessageBox</a>

個人能力有限,本文内容僅供學習、探讨,歡迎指正、交流。