2016-12-07 54 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