如何制作可观察收集的深层副本<;T>;在Silverlight 4中?

如何制作可观察收集的深层副本<;T>;在Silverlight 4中?,silverlight,observablecollection,Silverlight,Observablecollection,我想在Silverlight 4中制作一个ObservableCollection的深度副本,以便检测列表中项目的更改。既然iClonable在SL中不可用,我该怎么做 或者-是否有更好的方法检查集合中项目的更改 当然。如果您的单个实现INotifyPropertyChanged,那么您可以注册并监听该消息 基本上,您的单个项应该实现更改的属性。这里有一个小部件可以实现这一点: public class Widget : INotifyPropertyChanged { private

我想在Silverlight 4中制作一个ObservableCollection的深度副本,以便检测列表中项目的更改。既然iClonable在SL中不可用,我该怎么做


或者-是否有更好的方法检查集合中项目的更改

当然。如果您的单个实现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; }
}
公共类WidgetViewModel
{
公共WidgetViewModel()
{
Widgets=新的ObservableCollection();
Widgets.CollectionChanged+=Widgets\u CollectionChanged;
}
void Widgets\u CollectionChanged(对象发送方,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
如果(e!=null&&e.NewItems!=null)
{
foreach(e.NewItems.OfType()中的var小部件)
{
widget.PropertyChanged+=WidgetViewModel\u PropertyChanged;
}
}
如果(e!=null&&e.OldItems!=null)
{
foreach(e.OldItems.OfType()中的var小部件)
{
widget.PropertyChanged-=WidgetViewModel\u PropertyChanged;
}
}
}
void WidgetViewModel_PropertyChanged(对象发送方,System.ComponentModel.PropertyChangedEventArgs e)
{
开关(如PropertyName)
{
案例“Id”:
打破
案例“名称”:
打破
违约:
打破
}
}
公共ObservableCollection小部件{get;private set;}
}
在财产变更中,你可以处理发生的任何事情