2013-10-08 110 views
0

我們處於WinRT XAML中。依賴屬性具有控制建設時設置的值

我有一個自定義控件B與依賴項屬性Items,該控件在另一個控件的模板中。使用PropertMetadata類型將依賴項屬性初始化爲新的空集合。它永遠不會受到數據限制 - 牢記這一點。

當我進入頁面時,控件被實例化爲另一個自定義控件A的模板的一部分。從B構造函數中的斷點開始,當我檢查Items的值時,它包含0個項目。

作爲其他活動的一部分,控件A'手動'調用B.Items.Add()來插入數據。沒有數據綁定。

當我向後導航,然後再次點擊導航到頁面時,構造函數再次被觸發,但此時Items仍然有值A添加。它保留了它的價值。

因此,即使控件被卸載並加載(我可以看到事件),控件和依賴項屬性不會重新初始化。

這是正確的嗎?

回答

3

將依賴項屬性聲明爲類B中的靜態字段。它僅被初始化一次,因此屬性元數據中的新集合僅被初始化一次,然後由屬性的所有「實例」共享。這是依賴屬性聲明中常見的錯誤。

您應該將依賴項屬性值設置爲類B的構造函數中的新空集合,而不是通過屬性元數據提供默認值。

+0

感謝您的回答,但我不認爲它是正確的。屬性元數據應該應用於「新實例」。 「爲依賴項屬性提供的最常見的元數據是爲它們提供一個應用於使用該屬性的新實例的默認值。」 - MSDN。我嗅到一個錯誤,說實話。有些東西不適合這個。 –

+1

這絕對不是一個bug,並且已經在SO上討論了幾次。屬性元數據提供的默認值僅在控件的每個新實例中分配給該屬性。您可以簡單地通過同時創建自定義控件的兩個實例來測試這一點,並檢查「Items」值。它將是相同的集合對象,即您作爲默認值提供的集合對象。 – Clemens

+0

明白了,你是對的。 http://www.thomasclaudiushuber.com/blog/2010/02/11/be-careful-with-default-values-of-dependency-properties-if-youre-using-reference-types/ –