[分享]一些在 WPF/Silverlight 中應用 MVVM 模式時可能會有點用途的代碼

想來這個博客也已經有很久沒更新過了,新年新氣象,現在就開始寫新內容吧。

最初的起因?

在最近的幾個月中我做的開發總是要跟 XAML 打交道,也就是 WPF 啊,Silverlight 啊,WF 啊這些。

在進行 WPF 和 Silverlight 開發的過程中常常要用 MVVM 模式,鑒于網絡上關于 MVVM 的特點的文章一抓一大把,我這里就不進一步解釋 MVVM 了。

可是,在 WPF 和 Silverlight 中應用 MVVM 時,是要在 View Model 的屬性被改變的時候是要觸發 INotifyPropertyChanged.PropertyChanged 事件的,對于 C# 來說這部分是不能用像是“{ get; set; }”這樣簡化的語法來實現的;

而且 PropertyChangedEventArgs 的構造函數接受的是以 System.String 類型為載體的屬性名稱,這也就意味著如果把屬性名稱硬編碼在程序中,一旦日后因為什么原因要對代碼進行重構、改變屬性的名稱,就只能手工修改寫在字符串以匹配更改之后的屬性名稱,在這個過程中也是很容易產生失誤的。

所以往往在這個過程中開發人員可能會感到迷茫——到底 MVVM 是讓事情變簡單了還是變得麻煩了?

解決問題的幾種辦法

知道了實際應用 MVVM 模式時的困難,微軟推出的 Prism 框架中便定義了?NotificationObject 類型,派生自此類型的 View Model 可以通過 RaisePropertyChanged 方法來觸發 PropertyChanged 事件,而 RaisePropertyChanged 方法的其中一個重載形式接受的是簽名為 Func<T> 的 Lambda 表達式,也就是說如果使用這個重載,即使我們在未來修改了屬性的名稱,通過 Visual Studio 的重構工具也會自動把這個改動反映到對 PropertyChanged 事件的觸發中,不需要我們再手工修改字符串。

這個方法很多對表達式樹有了解的人大概都想得到,實際上我自己的 ASP.NET 壓縮模塊和 KyuuBackground 也用了類似的方法。

但是,使用表達式樹的話總會有些額外的開銷的,雖然對于觸發事件之后的一系列連鎖反應來說這個開銷可能并不是什么嚴重問題,但仍然有人覺得代碼不夠整潔,所以后來在隨著 Visual Studio 2012 一起到來的新版本 .NET 框架中支持了一種新的語法,通過在像是 RaisePropertyChanged 這樣的方法的簽名上添加 CallerMemberName 特性,就可以在調用代碼中省去傳遞屬性名稱的這個細節,同時也不用擔心會像使用表達式樹那樣產生額外的開銷。

實用的機能

可惜因為種種原因,我暫時還是只能用 Visual Studio 2010,享受不到 CallerMemberName 的便利性,并且即使是可以省去手工填入屬性名稱的動作,對屬性的后端字段的定義、訪問以及對 RaisePropertyChanged 的調用還是不能省略的,代碼寫著寫著我也煩躁了起來。

就在這個時候,我想起來 Visual Studio 中還有個功能叫做“代碼段”。

有了合適的工具,事情就好辦了,于是我立即動手編寫代碼段。

大體上,代碼段看上去是這樣的:

		private $type$ m$name$$end$;public $type$ $name${get { return m$name$; }set{if (value == m$name$) return;m$name$ = value;RaisePropertyChanged(() => $name$);}}

由于后端字段和對外暴露的屬性不可以重名,所以這里加了 m 字母作為前綴用以區分;同時我也經常使用 Prism 或者類似的 Library,所以是向 RaisePropertyChanged 方法中傳遞了一個 Lambda 表達式。

對于不使用 Prism 或者類似 Library 的開發人員,可以把對 RaisePropertyChanged 調用的這一行改為:

				RaisePropertyChanged("$name$");

而對于使用 Visual Studio 2012 的開發人員,則可以改為:

				RaisePropertyChanged();

附件中包含了完整的 .snippet 文件,可以在解壓之后通過 Visual Studio 的代碼段管理器導入,或者直接放入?My Code Snippets 文件夾中。

MVVM.zip

轉載于:https://www.cnblogs.com/NanaLich/archive/2013/01/04/yet-another-code-snippet-for-xaml-mvvm.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376944.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376944.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376944.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

手機調用系統的拍照和裁剪功能,假設界面有輸入框EditText,在一些手機會出現點擊EditText會彈出輸入法,卻不能輸入的情況。...

1、拍照裁剪后 點擊EditText會彈出輸入法&#xff0c;卻不能輸入。可是點擊點一EdtiText就能夠輸入了&#xff0c;所以我就寫了一個看不見的EdtiText&#xff0c;切換焦點&#xff0c;這樣就攻克了這個奇怪的這問題&#xff0c;應該是android內部的問題。 這是網絡一個牛人留下…

Redis一個命令請求從發送到完成的步驟以及初始化服務器步驟

一個命令請求從發送到完成的步驟 如下&#xff1a; 1、客戶端將命令請求發送給服務器 當用戶在客戶端中鍵入一個命令請求時&#xff0c;客戶端會將這個命令請求轉換成協議格式&#xff0c;然后通過連接到服務器的套接字&#xff0c;將協議格式的命令請求發送給服務器。 2、服…

c打印行號和函數_使用C中的函數名稱,行號從任何函數打印錯誤消息

c打印行號和函數Sometimes, it is necessary to print some message on logic failure or anytime with the function name and line number, so that program can be debugged and fixed the issue. 有時&#xff0c;有必要在邏輯故障時或在任何時候使用功能名稱和行??號打印…

Linux SPI框架

水平有限&#xff0c;描述不當之處還請指出&#xff0c;轉載請注明出處http://blog.csdn.net/vanbreaker/article/details/7733476 Linux的SPI子系統采用主機驅動和外設驅動分離的思想&#xff0c;首先主機SPI控制器是一種平臺設備&#xff0c;因此它以platform的方式注冊進內…

dbms標識符無效_DBMS中的嵌套查詢,相關的嵌套查詢和集合比較運算符

dbms標識符無效嵌套查詢 (Nested Queries) A query embedded in a query. This type of relation is termed as Nested Query and the Embedded Query is termed as a subquery. 查詢中嵌入的查詢。 這種類型的關系稱為嵌套查詢&#xff0c;而嵌入式查詢稱為子查詢。 For exam…

重構——解決過長參數列表(long parameter list)

目錄1、Replace Param with Query2、Preserve Whole Object3、Introduce Param Object4、Remove Flag Argument5、Combine Functions into ClassReference當我們需要在超長函數中提煉子函數時&#xff0c;如果函數內有大量的參數和臨時變量&#xff0c;這將會對函數的提煉形成很…

C# 點點滴滴: out和ref

用c#很長一段時間了&#xff0c;不過基本是啥都不會&#xff0c;當C用的&#xff0c;作為寫單片機的&#xff0c;還是真心覺得C比較親切&#xff0c;呵呵。 不過總是要進步啊&#xff0c;慢慢積累唄&#xff0c;這次是寫一個CAN的上位機模板出來&#xff0c;以后的項目就要徹底…

css控制圖片最寬 最高值

.content img{width:expression_r(this.width > 500 && this.height < this.width ? 500:true);max-width:500px;height:expression_r(this.height >500 ? 500:true);max-height:500px; }轉載于:https://www.cnblogs.com/panlin/archive/2013/01/06/2848017…

踩踩踩

http://china.findlaw.cn/laodongfa/ctjg/cy/cybc/ 二、合法裁員經濟補償標準的計算 按照《勞動合同法》第四十七條規定&#xff0c;經濟補償按勞動者在本單位工作的年限&#xff0c;每滿一年支付一個月工資的標準向勞動者支付。六個月以上不滿一年的&#xff0c;按一年計算;不…

c# 字節十六進制轉十進制_用C中的十進制,八進制和十六進制數字初始化字節數組...

c# 字節十六進制轉十進制C中的字節數組 (byte array in C) In C programming language, an unsigned char type can be used to declare byte array in C programming language. An unsigned char can contain a value from 0 to 255, which is the value of a byte. 在C編程語…

從uptime、stress、mpstat、pidstat觀察CPU密集型、IO密集型、進程密集型切換的系統性能

uptime dyydyy-Lenovo-ThinkBook-14-IIL:~$ uptime10:27:10 up 7 min, 1 user, load average: 1.32, 0.99, 0.49結果分別對應&#xff1a;當前時間、系統運行時間、當前用戶數目、過去 1 分鐘、5 分鐘、15 分鐘的平均負載(Load Average) 平均負載是指單位時間內&#xff0c…

解析和創建xml

http://www.cnblogs.com/Li-Cheng/p/3610474.html 轉載于:https://www.cnblogs.com/mxw272618/p/3769900.html

python - VirtualEnv virtualenvwrapper

VirtualEnv 是什么 VirtualEnv用于在一臺機器上創建多個獨立的python運行環境&#xff0c;VirtualEnvWrapper為前者提供了一些便利的命令行上的封裝。 為什么要用 - 隔離項目之間的第三方包依賴&#xff0c;如A項目依賴django1.2.5&#xff0c;B項目依賴django1.3。- 為部署應用…

多臺計算機共享內存_共享內存多處理器和指令執行| 計算機架構

多臺計算機共享內存共享內存多處理器 (Shared Memory Multiprocessor) There are three types of shared memory multiprocessor: 共有三種類型的共享內存多處理器&#xff1a; UMA (Uniform Memory Access) UMA(統一內存訪問) NUMA (Non- uniform Memory Access) NUMA(非統一…

htop與atop

htop htop使用詳解–史上最強 atop Linux atop監控工具部署

js未看的文章

Web前端研發工程師編程能力飛升之路 在瀏覽器的背后&#xff08;一&#xff09; —— HTML語言的詞法解析 組件化的前端開發流程 用js書寫UI組件之js基礎知識 GC與JS內存泄漏 藍色理想之前端開發 w3c JavaScript Puzzlers react AngularJS入門教程 jQuery源碼分析-如何做jQuery…

方法重寫,隱藏在子類父類中的各種調用實踐

一.子類和父類方法之間的關系 1.當子類和父類有方法完全相同的方法 namespace ConsoleApplication2 {class Program{static void Main(string[] args){B b new B();A a new A();A c new B();b.Show();a.Show();c.Show();Console.Read();}}public class A{public void Show()…

向量余弦值python_向量/矩陣的余弦值打印(元素明智的操作) 使用Python的線性代數

向量余弦值pythonPrerequisite: 先決條件&#xff1a; Defining a Vector 定義向量 Defining a Matrix 定義矩陣 Numpy is the library of function that helps to construct or manipulate matrices and vectors. The function numpy.cos(x) is a function used for generati…

centos 6.5網卡dhcp不能獲得網關

環境:vmware centos6.5 添加兩個虛擬網卡。一個自動獲取ip(用于上網-橋接) 一個手動(與主機通信用于ssh-NAT)。 因為自已手動改了一下ifcfg-eth0里面的HWADDR地址。造成 eth0網卡不能識別。多出一個eth2的網卡。 配置eth2網卡&#xff0c;可以自動獲取到ip地址 但用netstat -r…

CPU上下文切換(系統調用、進程上下文、線程上下文、中斷上下文)

CPU寄存器&#xff0c;與程序計數器&#xff08;存儲CPU正在執行的指令位置&#xff0c;或者即將執行的下一條指令的位置&#xff09;共同組成CPU上下文。 CPU上下文切換指的是&#xff1a;把前一個任務的CPU上下文保存起來&#xff0c;然后加載新任務的上下文到這些寄存器和程…