深层复制对象

时间:2015-06-26 23:14:34

标签: c# xaml data-binding windows-phone-8.1 observablecollection

我想在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>

1 个答案:

答案 0 :(得分:0)

包含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,而是清空现有的delay_while_idle并逐个添加副本中的每个元素。