public static readonly DependencyProperty XxxProperty,DependencyProperty.Register 註冊。GetValue/SetValue。PropertyChangedCallback 處理變更,建議轉呼叫實例方法。EnabledChanged),WPF 不建議。PropertyChanged 事件,適合非 DP 屬性。缺點:無法強制所有屬性觸發、無法靜態驗證。需求:集合中任一項目屬性變更時,觸發事件並告知「哪個項目、哪個屬性」。
ObservableCollection<T> (已實作 INotifyCollectionChanged)。T : INotifyPropertyChanged。OnCollectionChanged:新增項目訂閱 PropertyChanged,移除項目解除訂閱。PropertyChanged 時,集合轉發 ItemPropertyChanged 事件,參數含 Item 與 PropertyName。Binding 從目標物件來源繫結到自身新 DP。Freezable,自動獲得 Changed 事件。Changed,但 無法得知具體哪個屬性變更。FreezableCollection<T> 同樣特性,T 需為 DependencyObject,若為 Freezable 則子屬性變更也觸發。DependencyPropertyDescriptor.FromProperty(dp, ownerType) 取得描述元。AddValueChanged(targetObj, handler) / RemoveValueChanged 訂閱特定物件特定 DP 變更。EventHandler,sender 為目標物件,EventArgs 無資訊,需自行 GetValue 取得新值。整合 DependencyPropertyDescriptor 與 ObservableCollection<T>:
T : DependencyObject。public static DependencyProperty 欄位。DescriptorWrapper 封裝每個 DP 的 Descriptor 與回呼。OnCollectionChanged:項目加入/移除時批次 AddValueChanged/RemoveValueChanged。OnItemDependencyPropertyChanged 觸發 ItemDependencyPropertyChanged 事件,參數含 Item, Property, NewValue。INotifyPropertyChanged、Freezable 的萬用集合。