2016-12-07 12 views
1

我不知道錯誤在哪裏。我有元素的列表,稱爲TileModel使用默認值和ObservableCollection<TileModel> listC#(Xamarin)List,其中及其更改

當我在我的視圖模型顯示的形式我在這個列表中找到具有相同名稱的元素。如果列表中存在元素,我將該元素複製到ObservableCollection

public ObservableCollection<TileModel> testList { get; set; } 

List<TileModel> dsType = new List<TileModel>() { 
    new TileModel() { Text = "Alarms", IconImage = "Alarm.png", 
         NavigateType = typeof(Alarms) }, 
} 

在功能我有這樣的代碼:

foreach (string s in items) 
{ 
    TileModel dm = dsType.Where(d => d.Text.RemoveTextBetween("(", ")").Trim() == s) 
         .FirstOrDefault(); 
    if (dm != null) 
    { 
     dm.Text = UpdateTextItem(dm.Text, iType); 
     testList.Add(dm); 
    } 
} 

UpdateTextItem更名Text添加的記錄數。如果我使用F11跟隨代碼,那麼當我輸入函數dsType時是原始的。在dm.Text = UpdateTextItem(dm.Text, iType);之後,dsType更改爲dm.text

在我看來,dm是一個新變量,其中有一個列表值,但不是列表元素的一個實例。那麼爲什麼代碼更改我的原始dsType

預先感謝您。

回答

1

這是因爲你的課TileModel是一個參考類型。這意味着dm只是對原始對象的引用。

通過:

testList.Add(dm); 

你引用添加到您的testList - 如果它被改變的對象是一樣的,這也改變了你的對象在原來的列表中。 要避免這種情況。您可以添加這樣的項目:(如果您的ctor允許這樣)

var dm_new = new TileModel(dm); 
dm_new .Text = UpdateTextItem(dm_new .Text, iType); 
testList.Add(dm_new); 
+0

謝謝。我不知道。我沒有像你的例子那樣的ctor,然後爲了解決我的問題,我創建了一個新的'TileModel'並映射了每個屬性。 – Enrico

+0

或者你爲此創建了一個ctor,這會在下一次你面對類似的東西時幫助你;)引用類型對於新的程序員來說通常是一個問題,儘管你沒有看到它是或多或少的一個沒有' *」 – TripleEEE