2013-12-20 3 views
0

У меня есть OberservableCollection, хранящийся в моем изолированном хранилище.Как отредактировать элемент из списка, который хранится в изолированном хранилище?

Новая сцена содержит список. А Light содержит свойство Xpos en Ypos.

Как отредактировать этот список?

Поэтому я хотел бы получить его из IsoStorage, изменить 2 свойства и затем сохранить их снова.

Надеюсь, кто-то может мне помочь :).

С наилучшими пожеланиями, Niels

ответ

0

ObservableCollection «s имеют 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.