【问题标题】:How can I make a deep copy of an ObservableCollection<T> in Silverlight 4?如何在 Silverlight 4 中制作 ObservableCollection<T> 的深层副本?
【发布时间】:2011-07-12 13:14:26
【问题描述】:

我想在 Silverlight 4 中制作 ObservableCollection 的深层副本,以便检测列表中项目的变化。由于 ICloneable 在 SL 中不可用,我该怎么做?

或者 - 有没有更好的方法来检查集合中项目的变化?

【问题讨论】:

    标签: silverlight observablecollection


    【解决方案1】:

    当然。如果您的个人实现了 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; }
    }
    

    在属性变化中,无论发生什么都可以处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-31
      • 2015-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      相关资源
      最近更新 更多