2013-12-20 44 views
0

我有一個OberservableCollection存儲在我的獨立存儲中。如何從存儲在獨立存儲中的列表中編輯元素?

新場景包含一個列表。 Light包含一個Xpos en Ypos屬性。

如何編輯此列表?

因此,我想從IsoStorage中檢索它,更改2個屬性,然後再保存它。

希望有人能幫助我:)。

親切的問候, 尼爾斯

回答

0

ObservableCollection的有colleciton改變的事件,經過誰送的(基本集),以及一系列的參數。您可以收聽此CollectionChanged活動,只收聽新增項目並對該項目執行操作。

如果您的集合是被引用對象的列表,則可以直接對這些對象執行編輯,並且這些更改將被鏡像到列表中。但是,如果您正在使用值類型列表,則需要標記該項目的方式,以便在從列表中刪除項目並重新添加項目時,添加不會觸發無限循環。

實施例:

class Clean<T> 
{ 
    public T Value; 
    public bool IsClean; 
    public Clean(T value, bool clean) 
    { 
     Value = value; 
     IsClean = clean; 
    } 
} 

此清潔類用於存儲一個值以及一個標誌,如果其被處理或不標記。

class Program 
{ 
    static void Main(string[] args) 
    { 
     ObservableCollection<Clean<int>> myCollection = new ObservableCollection<Clean<int>>(); 
     myCollection.CollectionChanged += x_CollectionChanged; 

     myCollection.Add(new Clean<int>(2,false)); 

    } 

    static void x_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
     //Grab the collection being modified 
     ObservableCollection<Clean<int>> collection = sender as ObservableCollection<Clean<int>>; 
     if (collection == null) 
     { 
      // do some error checking action 
     } 
     //Only look at items being added 
     if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add) 
     { 
      //New item has been added 
      foreach (Clean<int> newItem in e.NewItems) 
      { 
       ///Only perform the operation on new "dirty" objects 
       if (!newItem.IsClean) 
       { 
        collection.Remove(newItem); 
        //Add the new modified value and mark it as clean so that 
        // this process isn't run again 
        collection.Add(new Clean<int>(newItem.Value * 2,true)); 
       } 
      } 
     } 

    } 
} 

來源:

ObservableCollectionMSDN Article

NotifyCollectionChangedEventHandlerMSDN Article

0

我只想取回集合按正常...

public IEnumerable<Scene> GetScenes() 
{ 
    using (var filesystem = IsolatedStorageFile.GetUserStoreForApplication()) 
    { 
     using (var fs = new IsolatedStorageFileStream("Scenes", FileMode.Open, filesystem)) 
     { 
      var serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(IEnumerable<Scene>)); 
      return serializer.ReadObject(fs) as IEnumerable<Scene>; 
     } 
    } 
} 

...然後編輯你需要什麼...

var myScenes = new ObservableCollection<Scene>(GetScenes()); 
var itemToUpdate = myScenes.Where(i => i.PropertyToCheck == "value to check"); 
itemToUpdate.PropertyToSet = "new value"; 

...並使用相同的密鑰,以確定它保存集合回獨立存儲。

SaveScenes(myScenes); 

如果您使用FileMode.Create它將覆蓋以前的集合。

public void SaveScenes(IEnumerable<Scene> scenes) 
{ 
    using (var filesystem = IsolatedStorageFile.GetUserStoreForApplication()) 
    { 
     using (var fs = new IsolatedStorageFileStream("Scenes", FileMode.Create, filesystem)) 
     { 
      var serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(IEnumerable<Scene>)); 
      serializer.WriteObject(fs, Scenes); 
     } 
    } 
} 

您可以找到一個similar example on MSDN