前一篇 簡單的介紹了fody/propertychanged的使用方法, 這一篇,我們詳細介紹它的一些比較重要的特性和規則
通過在類或屬性上標記這些特性,可以在編譯**時,注入特定的功能
為類標記此特性,可以實現inotifypropertychanged介面
[implementpropertychanged]
public class person
}
在實現通知時,也同時通知其它屬性
public class person : inotifypropertychanged
[alsonotifyfor("fullname")]
public string familyname
public event propertychangedeventhandler propertychanged;
public string fullname
}
在givenname或familyname變化時,會同時也通知fullname的變化
顧名思義,就是在編譯時,不在此屬性中注入變化通知的**
public class person : inotifypropertychanged
[donotnotify]
public string familyname
public event propertychangedeventhandler propertychanged;
}
設定乙個屬性,在它依賴的屬性變化時,通知此屬性發生變化
public class person : inotifypropertychanged
public string familyname
public event propertychangedeventhandler propertychanged;
[dependson("givenname","familyname")]
public string fullname
}
通過約定,在實現的類裡,如果有乙個屬性是ischanged
public bool ischanged
在其它類發生變化時,此類的值會自動被設定為true,
如果希望在某個屬性變化時,不響應此規則,可以將屬性標記為donotsetchangedattribute
public class person: inotifypropertychanged
public bool ischanged
public event propertychangedeventhandler propertychanged;
}
在fullname變化裡,不會將ischanged設定為true
預設情況下,所有注入的變化響應,都會檢查是否相等,如果相等,則不會進行通知;但在某些時候,我們也許需要無論是否相等都進行通知,這個時候,可以在屬性上標記donotcheckequalityattribute以跳過是否相等的檢查
public class person: inotifypropertychanged
public bool ischanged
public event propertychangedeventhandler propertychanged;
}
這樣,在給fullname賦值時,無論是否和之前的值相等,都會進行通知。
有時候,我們需要在值發生變化時,訪問變化之前和之後的值,比如做驗證時,我們可以通過加入下面的方法實現:
public void onpropertychanged(string propertyname, object before, object after)
比如,我們寫的**:
public class person : inotifypropertychanged
public void onpropertychanged(string propertyname, object before, object after)
}}
在編譯時,對應的**為:
public class person : inotifypropertychanged
set}
public void onpropertychanged(string propertyname, object before, object after)
}}
在設定屬性的值之前,會進行是否相等的檢查:
public string property1
set}
}
用於檢查是否相等的方法依賴於屬性的資料型別,按照下面的順序或規則進行比較:
在上面我們已經簡單的介紹了ischanged屬性,具體的實現**如下:
public class person : inotifypropertychanged
public event propertychangedeventhandler propertychanged;
public bool ischanged
}
public class person : inotifypropertychanged
} public string name
set} public bool ischanged
set}}
這樣,在name設定新值後,ischanged屬性會被設定為true
當然,在**邏輯中,在適當的時候需要手動將ischanged設定為false還有一些配置和規則,可以參見
WPF幾種高階繫結
1 binding relativesource ancestortype 模式 根據關聯源所指定的型別,可動態繫結指定型別的path屬性 path可以省略 ps 動態指父級在執行時才可以獲取到的屬性 例子如下 2 templatebinding模式 模板繫結 通常在控制項模板中 實現 靜態 繫結父...
wpf開發的著名軟體 WPF開發遠端啟動裝置和軟體
需求為對區域網內的伺服器遠端開關機 管理服務程序包括遠端啟動 關閉 重啟。原來的工作方式需要使用者手動開啟每台伺服器,並通過kvm切換到各個伺服器並且開啟軟體服務,工作完成後,手動關閉所有軟體及關閉機器。現增加服務管理軟體,可以做到一鍵開啟指定的裝置及服務,從而減少了啟動操作,優化使用者使用體驗。服...
WPF程式開發體驗
2008年的時候參加了乙個微軟的.net3.5的培訓的時候就知道了wpf,對xaml也很神往,可以一直忙於專案,沒有學習和體驗的機會。今年正好接手了乙個專案,開始使用winform做的demo和部分實現,客戶希望用wpf開發,正好給自己學習wpf的機會。粗略的看了遍 wpf經典教程.pdf 和網上對...