我想在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>
答案 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
并逐个添加副本中的每个元素。