首页 > 解决方案 > C# 事件处理程序不可用于其他参考

问题描述

我有一个示例类。它有一个带有事件处理程序的 ObservableCollection。

class SomeItem
{
    public ObservableCollection<Thing> Things = new ObservableCollection<Thing>();
    
    private SomeEventHandler(object Sender, NotifyCollectionChangedEventArgs E)
    {
        //do something
    }
    
    public SomeItem()
    {
        this.Things.CollectionChanged += SomeEventHandler;
    }
}

我正在执行以下代码:

SomeItem Instance = new SomeItem();

Instance.Things.Add(new Thing()); // SomeEventHandler executed;

SomeItem AnotherReference = Instance;

AnotherReference.Things.Add(new Thing()); // SomeEventHandler NOT executed

如果从AnotherReference访问集合,为什么不执行事件处理程序?

标签: c#eventsobservablecollection

解决方案


我无法重现该问题。此代码按预期工作。

using System;
using System.Collections.ObjectModel;
using System.Collections.Specialized;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args) {

            SomeItem Instance = new SomeItem();
          
            Instance.Things.Add(new Thing()); // SomeEventHandler executed;
            
            SomeItem AnotherReference = Instance;
            
            AnotherReference.Things.Add(new Thing()); // SomeEventHandler ALSO executed
        }
    }

    class Thing { 
    }

    class SomeItem
    {
        public ObservableCollection<Thing> Things = new ObservableCollection<Thing>();

        private void SomeEventHandler(object sender, NotifyCollectionChangedEventArgs e) {
            Console.WriteLine("Hello from SomeEventHandler");
        }

        public SomeItem() {
            this.Things.CollectionChanged += SomeEventHandler;
        }
    }
}

结果:

Hello from SomeEventHandler
Hello from SomeEventHandler
Press any key to continue.

推荐阅读