0
我想在Silverlight 4中創建ObservableCollection的深層副本,以檢測列表中項目的更改。由於ICloneable在SL中不可用,我該怎麼做?如何在Silverlight 4中創建ObservableCollection <T>的深層副本?
或者 - 有沒有更好的方法來檢查集合中項目的更改?
我想在Silverlight 4中創建ObservableCollection的深層副本,以檢測列表中項目的更改。由於ICloneable在SL中不可用,我該怎麼做?如何在Silverlight 4中創建ObservableCollection <T>的深層副本?
或者 - 有沒有更好的方法來檢查集合中項目的更改?
當然。如果你的個人實施INotifyPropertyChanged,那麼你可以註冊並聽取它。
基本上,您的個人項目應該實施更改的財產。這裏是一個小部件,它可以這樣做:
public class Widget : INotifyPropertyChanged
{
private int _id;
public int Id
{
get { return _id; }
set
{
_id = value;
RaisePropertyChanged("Id");
}
}
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
RaisePropertyChanged("Name");
}
}
private void RaisePropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
接下來,您需要管理可觀察集合並註冊到集合更改事件。當添加小部件時,您會掛鉤到屬性更改。當它們被移除時,您將取消掛鉤:
public class WidgetViewModel
{
public WidgetViewModel()
{
Widgets = new ObservableCollection<Widget>();
Widgets.CollectionChanged += Widgets_CollectionChanged;
}
void Widgets_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
if (e != null && e.NewItems != null)
{
foreach (var widget in e.NewItems.OfType<Widget>())
{
widget.PropertyChanged += WidgetViewModel_PropertyChanged;
}
}
if (e != null && e.OldItems != null)
{
foreach(var widget in e.OldItems.OfType<Widget>())
{
widget.PropertyChanged -= WidgetViewModel_PropertyChanged;
}
}
}
void WidgetViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
switch(e.PropertyName)
{
case "Id":
break;
case "Name":
break;
default:
break;
}
}
public ObservableCollection<Widget> Widgets { get; private set; }
}
在屬性更改中,您可以處理正在發生的任何事情。