2016-12-07 22 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というへの参照を追加する - それが変更されます場合は、オブジェクトが同じである、それはまたあなたの元のリストにあなたのオブジェクトを変更します。 これを回避するにはあなたはこのような項目を追加することができます:(あなたのCTでこれを許可している場合)

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

ありがとう。私はそれを知らなかった。私は私の問題を解決するためにあなたの例のようなctorを持っていません。私は新しい 'TileModel'を作成し、それぞれのプロパティをマップしました。 – Enrico

+0

これを行うためのctorを作成すると、次回のようなときに役立ちます;)参照型は、新しいプログラマーにとってはしばしばC++からの問題ですが、 * ' – TripleEEE

関連する問題