0

INotifyPropertyChanged インターフェイスを実装するアイテムを含む ObserableCollection があります。これは私がそれを作成する方法です:

        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の上に新しいmyCollectionを作成しても、イベントのコレクションのオブジェクトのリンクが解除されない場合は、反復を実行します

于 2009-12-14T12:12:26.037 に答える