2015-11-20 29 views
1

我是相當新的WPF,我想監聽屬性的更改將繼續被垃圾回收我的自定義控件...PropertyChangedEventHandler是否讓我的自定義控件不被垃圾收集?

從本質上講,我聽這樣的活動:

obj.PropertyChanged += this.The_PropertyChanged; 

我害怕我執行代碼的控制不能被垃圾收集,而obj仍然存在,因爲obj.PropertyChanged持有對this的引用。它是否正確?如果是這樣,避免這種情況的正確方法是什麼?如果我正確地告知,沒有Dispose()方法可能被重寫時,控制從屏幕上消失被調用,所以沒有明顯的位置,除去從obj.PropertyChangedthis.The_PropertyChanged ...

+0

首先,你確定你需要這個嗎?通常,PropertyChanged事件是通過綁定對象訂閱的,而不是由您的代碼訂閱的。 –

回答

0

是的,你是正確的。 obj將提及「this」,因此「this」不會被垃圾收集。解決方法是:

obj.PropertyChanged -= this.The_PropertyChanged; 

並且您將該代碼放置在「this」已關閉,已處置或明智不再需要的地方。

因此,對於控制,如果承載控件的窗口關閉,可能是您放置代碼的位置。

+0

謝謝:)但是,將責任放在誰在代碼中使用控件的人必須有更好的方法,但是呢?控件應該在添加窗口事件時收聽窗口事件嗎? – mutex

+0

控件不聽這些事件。事件發生時通知控制。 + =只是將事件處理函數添加到事件觸發時要調用的函數列表中。嘗試爲單個事件多次添加相同的事件處理程序。你會注意到,每次添加處理程序時,處理程序都會被調用一次。認爲它更像是處理程序是訂閱者,事件是發佈者。就像在現實世界裏,如果你不再想讓時代雜誌郵寄給你,你必須告訴他們停止發送它。 –