深拷贝 object

Deep Copy object

我想在 windows phone 8.1 平台上深度复制 collection(其中包含复杂的 objects 和其他 collection)。最好的解决方案是什么?

注意:我读到 "easiest"(最短)方式是这样的:

List<MyClass> copiedObject = 
  JsonConvert.DeserializeObject<List<MyClass>>(
      JsonConvert.SerializeObject(originalObject)
   );

但是如果我使用这个,我的 ObservableCollections 将不再工作,所以如果我将复制的 collection 绑定到 UI 元素,它不会在我更改 collection.

所以我的 "side-question" 是:为什么我的 collection 变成 "corrupted"?

绑定:

<Pivot.ItemTemplate> 
   <DataTemplate> 
      <ListView ItemsSource="{Binding EventList}"/> 
   </DataTemplate>
</Pivot.ItemTemplate>

包含 EventList 属性 的 class 应该实现 INotifyPropertyChanged 接口。

public class PageContext : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private ObservableCollection _eventList;

    protected void OnPropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName)));
        }
    }

    public ObservableCollection EventList
    {
        get { return _eventList; }
        set
        {
            if (value.Equals(_eventList)) return;
            _eventList = value;
            OnPropertyChanged("EventList");
        }
    }
}

当您第一次绑定时,ui 控件将存储对集合的引用,并将观察它是否有新的更改。之后您创建一个新集合并将其分配给 EventList 属性,但您没有通知 ui 控件集合已更改。

另一种选择是不创建新的 ObservableCollection,而是清空现有的并逐个添加副本中的每个元素。