0

我有一个带有项目的 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();

感谢您的任何意见。

干杯约瑟夫

4

2 回答 2

3

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

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

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

于 2009-12-14T12:13:22.587 回答
0

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

于 2009-12-14T12:12:26.037 回答