C# 为什么';t分配到ObservableCollection销毁CollectionChanged订户列表?

C# 为什么';t分配到ObservableCollection销毁CollectionChanged订户列表?,c#,variable-assignment,observablecollection,inotifycollectionchanged,C#,Variable Assignment,Observablecollection,Inotifycollectionchanged,我有一个可观的收集,我需要通过重新加载按钮来更换。在尝试此过程中,我发现CollectionChanged事件会激发,即使变量“myCollection”在“ReLoadData”中为空(请参见下面的代码示例),并分配了一个新的ObservableCollection,其中我没有向其CollectionChanged成员添加任何事件处理程序: public partial class MainWindow : Window { private Observable

我有一个可观的收集,我需要通过重新加载按钮来更换。在尝试此过程中,我发现CollectionChanged事件会激发,即使变量“myCollection”在“ReLoadData”中为空(请参见下面的代码示例),并分配了一个新的ObservableCollection,其中我没有向其CollectionChanged成员添加任何事件处理程序:

    public partial class MainWindow : Window
    {
        private ObservableCollection<string> myCollection = 
           new ObservableCollection<string>();

        public MainWindow()
        {
           InitializeComponent();

           myCollection.CollectionChanged += new    
           System.Collections.Specialized.NotifyCollectionChangedEventHandler(
           myCollection_CollectionChanged);
        }

        //Invoked in button click handler:
        private void ReLoadData()
        {
           ObservableCollection<string> newCollection =
              new ObservableCollection<string>();

           //Filling newCollection with stuff...

           //Marks old collection for the garbage collector
           myCollection = null;
           myCollection = newCollection;          
        }

        void myCollection_CollectionChanged(
           object sender,   
           System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
           //Set breakpoint on statement or one of the braces.
        }

        private void AddItem(object sender, RoutedEventArgs args)
        {

           //Why does the following fire CollectionChanged
           //although myCollection was nullified in
           //ReLoadAuctionData() before?
           myCollection.Add("AddedItem");

        }

   }
公共部分类主窗口:窗口
{
私有可观测集合myCollection=
新的可观察集合();
公共主窗口()
{
初始化组件();
myCollection.CollectionChanged+=新建
System.Collections.Specialized.NotifyCollectionChangedEventHandler(
myCollection_CollectionChanged);
}
//在按钮单击处理程序中调用:
私有void重载数据()
{
可观测集合新集合=
新的可观察集合();
//用东西填充新收藏。。。
//标记垃圾收集器的旧收集
myCollection=null;
myCollection=新集合;
}
void myCollection\u collection已更改(
对象发送器,
System.Collections.Specialized.NotifyCollectionChangedEventArgs(e)
{
//在语句或其中一个大括号上设置断点。
}
私有void附加项(对象发送方、RoutedEventArgs参数)
{
//为什么以下fire Collections发生了变化
//虽然myCollection在年被取消了
//是否在之前重新加载AuctionData()?
myCollection.Add(“AddedItem”);
}
}
我怀疑这可能与赋值运算符在C#中的实现方式有关,但据我所知,它不能在C#中重写,因此我不知道如何解释上述行为。。。有人知道吗?

(从评论中)


我怀疑,无论是谁“填充”了这个收藏,他仍然是一个艺术家 已连接到旧的“集合”


i、 e.无论INotifyCollectionChanged如何,这只是针对内部集合-您仍然需要“通知”任何“订阅者”整个集合已经更改-以及使用INotifyPropertyChanged-即在该“anulling”(这是不必要的)上。
您需要调用PropertyChanged(“集合”)或者叫什么名字

都很奇怪。确实在单击按钮时调用了ReLoadData()方法吗?我刚刚复制了这段代码并将其添加到构造函数中:
myCollection.Add(“lalala”);重新加载数据();myCollection.Add(“bobo”)。并且您的处理程序不会在第二个
Add
方法上调用。我认为您的按钮单击处理程序中存在一些错误。我怀疑无论是谁“填充”集合,都仍然连接到旧的“集合”——即,无论INotifyCollectionChanged是什么,这仅适用于内部集合-您仍然需要“通知”任何“订阅者”整个集合已更改-并且使用INotifyPropertyChanged-即,在该“anulling”(这是不必要的)上,您需要调用PropertyChanged(“collection”)或任何名称。