Как я могу сделать полную копию ObservableCollection <T>в Silverlight 4? - PullRequest
0 голосов
/ 05 августа 2010

Я хочу сделать глубокую копию ObservableCollection в Silverlight 4, чтобы обнаружить изменения в элементах списка. Так как ICloneable не доступен в SL, как я могу это сделать?

ИЛИ - есть ли лучший способ проверить наличие изменений в коллекции?

1 Ответ

0 голосов
/ 05 августа 2010

Конечно.Если ваша личность реализует 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; }
}

В изменении свойства вы можете иметь дело со всем, что происходит.

...