當您使用 Windows 簡報 Foundation 中的資料繫結時,可能會發生記憶體遺漏

文章翻譯 文章翻譯
文章編號: 938416 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

徵狀

當您使用資料繫結在 Microsoft 「 Windows 簡報基礎 (WPF) 時,可能會發生記憶體遺漏。

發生的原因

如果下列情況成立,就會發生這個問題:
  • 資料繫結路徑參考的物件 XP 屬性。
  • 物件 X 包含直接參考或間接參考資料繫結作業的目標。
  • P 屬性被經由一個 PropertyDescriptor 物件而不是 DependencyProperty 物件或 PropertyInfo 物件。

其他可行方案

如果要解決這個問題,使用下列方法之一。

方法 1

存取屬性 P 透過 DependencyProperty 物件。

方法 2

顯露 INotifyPropertyChanged 介面上物件 X

方法 3

將資料繫結的模式設定為 OneTime

狀況說明

這種行為是經過設計規劃的。

其他相關資訊

在 WPF,未標示為 OneTime 必須接聽屬性的一個資料繫結作業會變更通知從來源物件 (物件 X)。 WPF 使用從 INotifyPropertyChanged 介面 DependencyProperties 類別的內建的通知。

如果無法使用 DependencyProperties 類別和 INotifyPropertyChanged 介面,WPF 會使用 ValueChanged 事件。 這個問題牽涉到對應至屬性 P [PropertyDescriptor 物件上呼叫 PropertyDescriptor.AddValueChanged 方法。 不幸的是,此巨集指令會導致公用語言執行時間 (CLR) 從 X 這個 PropertyDescriptor 物件以物件建立強式參考。 CLR 也保留通用資料表 PropertyDescriptor 物件的參照。 這種行為會造成參考鏈結,以下列順序發生:
  1. 通用資料表
  2. PropertyDescriptor 物件
  3. Object X
  4. 資料繫結目標

    附註X 的物件與資料繫結目標之間的參考是由 < 原因 > 一節中所列的第一個條件所造成。
  5. 繫結
只要使用資料繫結目標繫結必須繼續接聽的變更。 這種行為會參考持續作用 PropertyDescriptor 物件之間,以及將物件 X,而目標會維持使用中。 在物件 XX 是指到哪一個物件的每個物件中,這個行為會導致記憶體遺漏。 這些物件包括資料繫結目標。

因應措施方法 1 和因應措施方法 2 會造成 WPF 使用其中一種慣用的通知機制。 因應措施方法 3 指示 WPF 不到接聽變更通知。 所有三種因應措施方法避免建立之間 PropertyDescriptor 物件參考,以及物件 X

在下列的程式碼範例會建立在遺漏的條件
<Label Name="MyLabel">
   <Stack Panel Name="MyStackPanel">
      <TextBlock Text="{Binding ElementName=MyStackPanel, Path=Children.Count}" />
   </StackPanel>
</Label>
在這個程式碼] 範例中 Count 屬性表示 P 屬性。此外,物件 X 表示 UIElementCollection 類別 StackPanel.Children 屬性的形式。

因為物件 X 參考到物件 X 的子系,是符合 < 原因 > 一節中的第一個條件。這些子系包含繫結] 目標和繫結目標是 TextBlock 項目。

因為 P 屬性不是一個 DependencyProperty] 物件,物件 X 未實作 INotifyPropertyChanged 介面是符合 < 原因 > 一節中的第二個條件。 這種行為會導致 UIElementCollection 類別和 TextBlock 元素不會釋放。 此外,StackPanel 容器類別是不會發行,因為 UIElementCollection 類別包含 StackPanel 容器類別的參考。 即使 UIElementCollection 類別和 TextBlock 項目會移除從主要的樹狀目錄使用 code:
MyLabel.Content = <Some New Content>;

屬性

文章編號: 938416 - 上次校閱: 2007年7月26日 - 版次: 1.1
這篇文章中的資訊適用於:
  • Microsoft .NET Framework 3.0
關鍵字:?
kbmt kbtshoot kbprb KB938416 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:938416
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com