深拷贝 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
,而是清空现有的并逐个添加副本中的每个元素。
我想在 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
,而是清空现有的并逐个添加副本中的每个元素。