為了讓物件支援Data Binding,資料物件必須實作INotifyPropertyChanged介面,提供PropertyChanged事件,並在屬性值變動時,以便即時通知UI更新繫結對象的顯示內容。而實作INotifyPropertyChanged的類別,在宣告每個屬性時都要寫成如下格式:

private bool connected;
public bool Connected
{
    get { return connected; }
    set
    {
        connected = value;
        OnPropertyChanged("Connected");
    }
}

不能只用public bool Connected { get; set; }帶過。

為了簡化撰寫程序,我會用propfull Snippet(Snippet是什麼? 能吃嗎?)先建出私有變數、get、set區塊,再為set區塊插入OnPropertyChanged。問題出在,我是一名耐心比0.5自動鉛筆筆芯還細的莽夫,同樣的步驟重複超過三次就會肝火上升,於是興起製作內含OnPropertyChanged程式碼propfull的念頭。動手前找了一下,網路上已有先進寫好了Snippet,這下就樂得不用自己造輪子囉~

將該文章的兩段程式存成notifyo.snippet及notifyp.snippet,開啟VS2012的Code Snippet Manager,即可將這兩個Snippet匯入Visual C#自訂程式片段區。(X:\Users\username\Documents\Visual Studio 2012\Code Snippets\Visual C#\My Code Snippets)

匯入後,現在只要輸入notifyp,Visual Studio會自動帶出程式片段,我們只需填入型別及屬性名稱(下圖紅框處,一個包含OnPropertyChanged的屬性宣告就完成了。

網路上還有其他透過更複雜機制簡化程式撰寫的方法(例如使用Attribute標示,或是像這篇,甚至用上了修改MSIL的大絕... 佷可怕,不要問!),個人偏愛KISS原則(Keep It Simple and Stupid,或者更有學問一點,要說我是奧卡姆剃刀的愛用者),使用Snippet已讓宣告屬性的撰寫步驟簡化到合理可接受的程度,我選擇不再追求更省事的做法,以保有系統架構的單純性。


Comments

# by Ike

請教一下…為什麼是「剃刀」!?

# by Yang

“剃刀”:若无必要,勿增实体

# by Ike

哈,我是想問…為什麼是用「剃刀」來當理論的名稱,而不是「菜刀」、「美工刀」、「手刀」…之類的?

Post a comment