深层复制对象

本文关键字:对象 复制 | 更新日期: 2023-09-27 18:00:14

我想在Windows Phone 8.1平台上深度复制一个集合(其中包含复杂对象和其他集合(。最好的解决方案是什么?

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

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

但是如果我使用它,我的 ObservableCollections 将不再工作,所以如果我将复制的集合绑定到 UI 元素,它在我更改集合中的某些内容后不会更新。

所以我的"附带问题"是:为什么我的收藏会"损坏"?

捆绑:

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

深层复制对象

包含 EventList 属性的类应实现 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 ,而是清空现有的一个,然后逐个添加副本中的每个元素。