WPF開發高階

2021-07-26 18:15:19 字數 2970 閱讀 8158

前一篇 簡單的介紹了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 和網上對...