CollectionChanged事件未在静态ObservableCollection上触发

时间:2015-05-29 11:18:37

标签: c# observablecollection static-members inotifycollectionchanged

在一个课程中,我将对象添加到我的ObservableCollection中。在另一个课程中,我用我添加的对象做事,然后从集合中删除它。

这两个类无法相互通信,所以我决定选择static集合(由于某种原因我只能访问类定义)

在我的第一堂课中,正确添加了所有元素(我检查了Count属性),在第二节课中我订阅了CollectionChanged事件。但是,事件并没有提高。我认为这是因为static关键字,但我不确定。

以下是代码示例:

static public class A
{
public static ObservableCollection<object> MyCollection = new ObservableCollection<object>();
}

public class B
{
public B()
{
A.MyCollection.CollectionChanged += Func_CollectionChanged;
}
 void Func_CollectionChanged(...)
{
  //Stuff
}
}
public class C
{
   public void func()
    {
    A.MyCollection.Add(object);
    }
}

1 个答案:

答案 0 :(得分:2)

这对我来说很好用:

 class Program
    {
        static void Main(string[] args)
        {
            B obj = new B();  
        }
    }
    public class A
    {
        public static ObservableCollection<object> MyCollection = new ObservableCollection<object>();
    }
    public class B
    {
        public B()
        {
            A.MyCollection.CollectionChanged += Func_CollectionChanged;
            A.MyCollection.Add(1);
        }

        private void Func_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            // do some stuff here
        }
    }

使用A.MyCollection.CollectionChanged行创建EventHandler来处理集合更改事件。它会在集合中进行任何更改(添加/更新/删除)时触发。由于它是您正在创建的委托,您必须指定拥有该事件的sender和参数的类型(它将要处理的内容),以便正确报告已发布的事件

<强>更新

您只需查看代码即可。尚未创建class b的实例,只有在创建类的新实例时,才会自动调用此类的构造函数。您正在类b的构造函数中创建Event handler。所以它尚未发布任何活动。这就是您的代码段中没有触发collection_Change事件的原因。

因此,您对C类的定义类似于以下内容来注册事件:

  public class C
    {
        B obj = new B();
        public void func()
    {          
    A.MyCollection.Add(1);
    }
    }