C#:从ObservableCollection中删除事件?

时间:2009-12-14 12:01:03

标签: c# observablecollection

我有一个带有Items的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 个答案:

答案 0 :(得分:3)

如果我理解正确, 你有一个对象的集合。对于每个对象,您已订阅了一些成员事件。现在,您的对象具有对处理函数的引用。

清除集合时,如果没有其他人引用成员对象,则无需明确取消订阅。对象将被垃圾收集 当发布者超过订阅者时会出现问题,在这种情况下,由于事件处理程序/委托引用,它会使订阅者保持活动状态。例如如果您将发布者存储在静态字段中,如果您没有明确取消订阅 - 则GC不会收集订阅者。

另请参阅:1198076和其他相关问题。

答案 1 :(得分:0)

我认为是myCollection.Clear();或者在旧的myCollection上创建一个新的myCollection不会取消链接事件集合的对象,然后我会进行迭代