C #: удалить события из ObservableCollection? - PullRequest
0 голосов
/ 14 декабря 2009

У меня есть ObserableCollection с элементами в ней, которые реализуют интерфейс INotifyPropertyChanged. Вот как я его создаю:

        var myCollection = new ObservableCollection<MyViewModel>();
        myCollection.CollectionChanged += OnCollectionChanged;

_

        private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (e.NewItems != null)
            {
                if (e.Action == NotifyCollectionChangedAction.Remove)
                {
                    foreach (ViewModelBase item in e.NewItems)
                    {
                        item.PropertyChanged -= myViewModelPropertyChanged;
                    }
                }
                else if (e.Action == NotifyCollectionChangedAction.Add)
                {
                    foreach (ViewModelBase item in e.NewItems)
                    {
                        item.PropertyChanged += myViewModelPropertyChanged;
                    }
                }
            }
        }

Теперь мой вопрос: нужно ли зацикливаться на всех элементах и ​​удалять «myViewModelPropertyChanged» перед выполнением другого

myCollection = new ObservableCollection<MyViewModel>();

или это происходит автоматически? Как насчет myCollection.Clear ();

Спасибо за любой вклад.

Приветствие Джозеф

Ответы [ 2 ]

3 голосов
/ 14 декабря 2009

Если я правильно понимаю, у вас есть коллекция предметов. Для каждого объекта вы подписались на некоторые членские события. Теперь ваш объект имеет ссылку на ваши функции-обработчики.

Когда вы очищаете коллекцию, если никто не ссылается на объекты-члены, вам не нужно явно отписываться. Объекты будут собирать мусор.
Проблема возникает, когда издатель переживает подписчика, и в этом случае он поддерживает работу подписчика благодаря ссылкам обработчика / делегата события . например если вы храните издателя в статическом поле, если вы не отмените подписку явным образом - GC не получит подписчика.

См. Также: 1198076 и другие связанные вопросы.

0 голосов
/ 14 декабря 2009

Я думаю, что myCollection.Clear (); или создание новой коллекции myCollection поверх старой не приведет к отсоединению объектов вашей коллекции события, и тогда я выполню итерацию

...