WPF Binding
Binding的亮點
在WPF中,Binding無處不在,關于Binding的漂亮用法有很多,其主要的設計亮點有二:
監聽B的屬性變化,A需要注冊B的PropertyChanged事件,.net中事件是強引用,一旦A注冊了B的事件,B就持有了一個A的引用。也就是說,如果A不注銷B的事件,即使A已經空置,如果B對象存活,垃圾回收器仍不會回收A的內存,在使用中就造成了A的內存泄露。在Binding的使用過程中,可能會出現多級綁定,A->B->C,一個對象也可能綁定多個對象,在對象空置時注銷綁定的監聽事件是不太現實的,實現起來太過繁瑣。這里就期望能有弱事件(Weak Event)模式,即A監聽了B的事件后,B不會阻止A的垃圾回收。
直接把A的屬性綁定到B的屬性上有時也是不太友好的,比如B的屬性是string,A的屬性是DateTime,在綁定的過程中需要做一定的轉換(Convert)。WPF/Silverlight中的Converter是很不錯的想法,可以自定義一些轉換,在屬性間做一些轉換工作。
設計
開始設計實現BindingEngine,首先來解決弱事件的問題。
在.net中,可以使用WeakReference(弱引用)來監視對象,WeakReference不會阻止對象的垃圾回收。在實際使用中,A注冊B的事件后,B持有了A的引用,B對象會阻止A的垃圾回收。直接把B對象變成弱引用對象是不現實的,但可以引入弱引用對象C,讓B持有C的引用,C持有A的引用。這樣即使沒有注銷事件監視,C對象仍持有A的引用,但是C對象是弱引用對象,不會阻止A的垃圾回收。
用一副圖表示:
把用來作為中間傳遞的C類命名為WeakSource,它的設計如下:
WeakSource用來隔離A對象,為了內存考慮,它和A對象間是一一對應關系。這樣,在監聽B的PropertyChanged事件時,原有的b.ProppertyChanged += a.HandlePropertyChanged就變成了b.PropertyChanged += weakSource.HandlePropertyChanged。WeakSource提供了兩個靜態方法Register和UnRegister來創建和銷毀WeakSource,其中的第一個參數object Source就是WeakSource需要封裝的A對象。
Register的第二個參數INotifyPropertyChanged target,就是需要監聽的B對象,最后一個參數targetProp是需要監聽B對象的屬性名。當B的屬性值發生變化時,WeakSource會得到通知,為了完成綁定,WeakSource需要把內部封裝的A對象對應的屬性值設置為B對象綁定屬性的新值。
?
文章來源:http://www.cnblogs.com/Zhouyongh/archive/2011/03/09/1977768.html
轉載于:https://www.cnblogs.com/luohengstudy/archive/2013/05/31/3110822.html
總結
以上是生活随笔為你收集整理的WPF Binding的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习总结9
- 下一篇: 数据连接java面试题