为啥分配给 ObservableCollection 不会破坏 CollectionChanged 订阅者列表?

Posted

技术标签:

【中文标题】为啥分配给 ObservableCollection 不会破坏 CollectionChanged 订阅者列表?【英文标题】:Why doesn't assignment to ObservableCollection destroy CollectionChanged subscribers list?为什么分配给 ObservableCollection 不会破坏 CollectionChanged 订阅者列表? 【发布时间】:2013-03-21 20:28:25 【问题描述】:

我有一个 ObservableCollection,我需要通过重新加载按钮来替换它。在尝试这个过程中,我发现即使变量“myCollection”在“ReLoadData”中被取消(参见下面的代码示例)并分配了一个新的 ObservableCollection,但我没有向其 CollectionChanged 成员添加任何事件处理程序,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");

        

   

我怀疑这可能与赋值运算符在 C# 中的实现方式有关,但据我所知,它不能在 C# 中被覆盖,所以我不知道如何解释上述行为......有人知道吗?

【问题讨论】:

这很奇怪。你确定你真的在按钮点击时调用 ReLoadData() 方法吗?我刚刚复制了这段代码并将其添加到构造函数中:myCollection.Add("lalala"); ReLoadData(); myCollection.Add("bobobo");。而且您的处理程序不会在第二个 Add 方法上调用。我认为您的按钮单击处理程序中有一些错误.. 我怀疑谁在“填充”集合 - 仍然连接到旧的“集合” - 即不管 INotifyCollectionChanged,这只是用于内部集合 - 你仍然需要“通知” '整个'集合已更改的任何'订阅者' - 以及使用 INotifyPropertyChanged - 即在那个'取消'(这是不必要的顺便说一句。)你需要调用 OnPropertyChanged("Collection") 或任何名称。 【参考方案1】:

(来自评论)

我怀疑“填充”收藏的人仍然是 连接到旧的“集合”

即不管INotifyCollectionChanged, that's just for inside collection如何-您仍然需要“通知”任何“订阅者”“整个”集合已更改-并且使用INotifyPropertyChanged-即在“取消”上(顺便说一句,这是不必要的。)@ 987654322@。

【讨论】:

以上是关于为啥分配给 ObservableCollection 不会破坏 CollectionChanged 订阅者列表?的主要内容,如果未能解决你的问题,请参考以下文章

为啥数组不能分配给Iterable?

为啥不能将匿名方法分配给 var?

为啥自定义子查询类型不能分配给 GraphQLObjectType?

为啥将 UICollectionViewLayout 分配给 UICollectionView 后 UICollectionViewCells 不再可见?

为啥从函数调用分配给属性 innerHTML 不起作用?

为啥在java中不允许分配给'this'?