2011-03-23 125 views
1

我想複製一個observablecollection中的列表項。當我這樣做時:複製一個ObservableCollection項目

  TreasureCards[TreasureCards.Count - 1] = TreasureCards[CardPosition]; 

它創建特定列表項的副本,但它們在我的用戶界面中鏈接。所以如果我更改新的重複項目的名稱,它會更改原始名稱。我知道我可以逐個完成每個屬性(請參見下文),但有沒有辦法只複製整個項目?

TreasureCards[TreasureCards.Count - 1].Name = TreasurecCards[CardPosition].Name; 
    TreasureCards[TreasureCards.Count - 1].Type= TreasurecCards[CardPosition].Type; 

// etc 

回答

4

你是不是複製的對象。您正在創建對該對象的新引用。仍然只有一個對象;現在在您的集合中有兩個對它的引用,並且對這個對象的任何改變都被這兩個引用所反映。

要創建一個新的對象,你可以在任何從Object派生調用MemberwiseClone()。此方法返回一個新實例,複製原始對象中所有字段的值。所以你會這樣做:

TreasureCards[TreasureCards.Count - 1] = TreasureCards[CardPosition].MemberwiseClone(); 

這種方法有兩個限制。首先,它是淺拷貝,即原始對象中的任何引用字段都將其值複製。因此,如果a.Foo是對Bar對象的引用,則a.MemberwiseClone().Foo將引用相同的Bar對象。其次,該方法只複製字段;它不會調用新對象的構造函數。根據課程設計的不同,這可能不重要,也可能是真正的大交易。

通常情況下,它的安全,使類實現ICloneable並明確實施Clone()方法,例如:

public TreasureCard Clone() 
{ 
    return new TreasureCard 
    { 
     Name = this.Name, 
     Type = this.Type, 
     ... 
    }; 
} 
+0

對不起,我的響應延遲,我還沒有機會在我的項目上工作到現在。感謝您的幫助羅伯特 - 我能夠讓我的克隆工作! – Stacey 2011-03-25 02:11:27

1

它們沒有鏈接,它們是相同的實例。你所做的就是將一個引用複製到數組中的另一個位置。

你需要做的是實現一些複製原始實例但作爲另一個實例的複製方法。這SO post可能會有所幫助。

,那麼你會做這樣的事情:

TreasureCards[TreasureCards.Count - 1] = TreasureCards[CardPosition].Clone(); 
相關問題