2014-09-29 140 views
0

我必須有某種語法錯誤。出於某種原因,我的依賴對象表現得像靜態一樣。我沿着以下線的東西:如何防止DependencyObjects在所有實例之間共享其DependencyProperties?

public void main() 
{ 
    MyClass C1 = new MyClass(); 
    MyClass C2 = new MyClass(); 

    C1.StringCollection.Add("Test1"); 
    Console.WriteLine(C2.StringCollection.First()); 
} 

public class MyClass : DependencyObject 
{ 
    public static DependencyProperty StringCollectionProperty = DependencyProperty.Register(
     "StringCollection", 
     typeof(ObservableCollection<string>), 
     typeof(MyClass), 
     new PropertyMetadata(new ObservableCollection<string>())); 

    public ObservableCollection<string> StringCollection 
    { 
     get { return(ObservableCollection<string>)GetValue(StringCollectionProperty); } 
     set { SetValue(StringCollectionProperty, value); } 
    } 
} 

給出了下面的輸出:

Test1 

元素加入到C2將在C1的StringCollection,反之亦然。任何想法我做錯了什麼?

+4

'DependencyProperty'將保持每個對象的值,但它共享其默認值,在您的情況下'ObservableCollection '。如果它是一個引用類型,它將是相同的值。初始化爲null – dkozl 2014-09-29 09:58:00

回答

1

AquariumFishes示例中的MSDN頁中提及了完全相同的行爲。

在同一頁面引用摘錄略加修改:

這是因爲每個MyClass的添加的字符串爲默認值集合,這是由於在元數據中的單個構造函數調用,並且因此所有實例之間共享。這種情況幾乎從來都不是你想要的。

要解決此問題,必須將集合依賴項屬性值重置爲唯一實例,作爲類構造函數調用的一部分。由於屬性是隻讀依賴項屬性,因此可以使用SetValue(DependencyPropertyKey,Object)方法使用只能在類中訪問的DependencyPropertyKey對其進行設置。

public MyClass() : base() 
{ 
    SetValue(StringCollectionProperty, new ObservableCollection<string>()); 
} 

現在,如果你跑了相同的測試代碼再次,你可以看到更多的預期結果,其中每個MyClass的支持它自己的獨特的收藏。 如果您選擇讓您的集合屬性爲可讀寫,則此模式會有一些細微變化。在這種情況下,您可以從構造函數中調用公共設置訪問器來執行初始化,該初始化仍將使用公共DependencyProperty標識符調用設置包裝器中的SetValue(DependencyProperty,Object)的非鍵簽名。

+0

rrg,這是有道理的。非常感謝! – Zaaier 2014-09-29 10:20:38

+0

使用'SetCurrentValue'確實更好。如果使用'SetValue',則值源變爲'Local',它將取代由樣式/模板觸發器,設置器等設置的任何值。 – 2014-09-29 15:15:10

相關問題